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

Posted

技术标签:

【中文标题】如何使用 rake db:migrate 仅回滚一步【英文标题】:How to rollback just one step using rake db:migrate 【发布时间】:2011-05-20 03:58:53 【问题描述】:

db/migrate文件夹中添加迁移文件并运行rake db:migrate后,我想回到上一步,我认为使用VERSION=n是正确的方法,但我不知道正确的方法要使用的 n 值。有什么命令可以查看当前的 n 值吗?

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

【问题讨论】:

【参考方案1】:

初学者

rake db:rollback 会让你后退一步

然后

rake db:rollback STEP=n

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

更多参考here。

【讨论】:

【参考方案2】:

回滚最近的迁移:

rake db:rollback

回滚 n 最近的迁移:

rake db:rollback STEP=n

您可以在Rails Guide for running migrations 上找到有关使用 Rails 迁移任务进行 rake 的完整说明。


这里还有一些:

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 方法

并回答有关从何处获得迁移版本号的问题:

版本是迁移文件名的数字前缀。为了 例如,迁移到版本 20080906120000 运行

$ rake db:migrate VERSION=20080906120000

(来自 Rails 指南中的 Running Migrations)

【讨论】:

当 rake db:rollback 无法回滚最近的迁移时,我不得不使用 rake db:migrate VERSION= 并且效果很好【参考方案3】:

最好的方法是使用 down 或 up 再次运行特定迁移(在 rails 4 中。它的变化)

rails db:migrate:up VERSION=timestamp

现在你如何获得时间戳。 走这条路

/db/迁移

确定要还原的迁移文件。从该文件名中选择时间戳。

【讨论】:

虽然这不能回答问题,但它确实是最好的方法。逐步回滚可能会导致错误,尤其是在团队中处理软件时。【参考方案4】:

如果版本是20150616132425,则使用:

rails db:migrate:down VERSION=20150616132425

【讨论】:

【参考方案5】:

其他人已经回答了您如何回滚,但您也询问了如何识别迁移的版本号。

rake db:migrate:status 列出了您的迁移版本、名称和状态(向上或向下) 您还可以找到迁移文件,文件名中包含时间戳,即版本号。迁移位于文件夹中:/db/migrate

【讨论】:

顺便说一下,如果您运行 status 命令,您可能会看到如下行: ********** NO FILE ********** 这些迁移不是如果您使用 git,则存在于您当前的分支中。【参考方案6】:
  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');
    

【讨论】:

此问题已包含多个答案和一个已接受的答案。您能否解释(通过编辑您的答案)您的答案与其他答案的不同之处?也知道从长远来看,仅代码的答案是没有用的。

以上是关于如何使用 rake db:migrate 仅回滚一步的主要内容,如果未能解决你的问题,请参考以下文章

为啥 rake db:migrate:reset 未在 rake -T 中列出?

使用 rake db:migrate 迁移数据不会改变它

为啥 rake db:rollback 回滚三步?

兼容性问题? rake db:migrate - 参数数量错误(1 代表 0)

markdown rake db:reset,rake db:migrate:resetの违い

Can't rake:db migrate - 继续让 'rake 中止!加载错误' [重复]