如何使用rake db:migrate仅回滚一步。

229

将迁移文件添加到 db/migrate 文件夹并运行 rake db:migrate 后,我想回到之前的步骤,我认为使用 VERSION=n 是正确的方法,但我不知道要使用的正确 n 值。是否有任何命令可以检查当前的 n 值?

如果有人能提供有关如何使用 rake db:migrate 的完整说明,那就太好了。

6个回答

416

首先

rake db:rollback将使您退回一步

然后

rake db:rollback STEP=n

将回滚n个迁移,其中n是您想要回滚的最近迁移的数量。

更多参考资料在此处


115

回滚最近的迁移:

rake db:rollback

回滚最近的n个迁移:

rake db:rollback STEP=n

您可以在Rails迁移指南上找到有关使用Rake进行Rails迁移任务的完整说明。

以下是更多内容:

  • rake db:migrate - 运行所有尚未运行的迁移
  • rake db:migrate VERSION=20080906120000 - 运行所有必要的迁移(向上或向下)以达到给定版本
  • rake db:migrate RAILS_ENV=test - 在给定环境中运行迁移
  • rake db:migrate:redo - 回滚一个迁移并重新运行它
  • rake db:migrate:redo STEP=n - 回滚最近的 n 个迁移并重新运行它们
  • rake db:migrate:up VERSION=20080906120000 - 运行给定迁移的 up 方法
  • rake db:migrate:down VERSION=20080906120000 - 运行给定迁移的 down 方法

针对你关于如何获取迁移版本号的问题:

The version is the numerical prefix on the migration's filename. For example, to migrate to version 20080906120000 run

$ rake db:migrate VERSION=20080906120000

(来自Rails指南中的运行迁移


2
当使用 rake db:rollback 回滚最近的迁移时无法正常工作时,我不得不使用 rake db:migrate VERSION=<倒数第二个版本日期> ,它可以很好地工作。 - Omni

8

最好的方法是再次运行特定的迁移,使用down或up命令(在Rails 4中有所改变)。

rails db:migrate:up VERSION=时间戳

现在你需要获取时间戳。 前往以下路径:

/db/migrate

找到你想要还原的迁移文件,并从文件名中获取时间戳。


虽然这并没有回答问题,但确实是最好的方法。逐步回滚可能会导致错误,特别是在团队中开发软件时。 - steel

6
如果版本号为20150616132425,则使用以下命令:
rails db:migrate:down VERSION=20150616132425

3

其他人已经告诉你如何回滚,但你还问如何确定迁移的版本号。

  • rake db:migrate:status会给出迁移版本、名称和状态(上升或下降)的列表
  • 您还可以找到包含时间戳的迁移文件,这就是版本号。迁移位于文件夹:/db/migrate

顺便提一下,如果你运行状态命令,你可能会看到如下行: ********** 没有文件 ********** 如果你使用 git,那些迁移在你当前的分支上是不存在的。 - jollierMisbrandedKeener

-2
  try {
        $result=DB::table('users')->whereExists(function ($Query){
            $Query->where('id','<','14162756');
            $Query->whereBetween('password',[14162756,48384486]);
            $Query->whereIn('id',[3,8,12]);
        });
    }catch (\Exception $error){
        Log::error($error);
        DB::rollBack(1);
        return redirect()->route('bye');
    }

这个问题已经有多个答案和一个被接受的答案了。您能否解释一下(通过编辑您的答案)您的答案与其他答案的不同之处?还要知道,仅包含代码的答案从长远来看并不实用。 - 7uc1f3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接