当前位置: 首页 > 面试题库 >

回滚失败的Rails迁移

田博远
2023-03-14
问题内容

如何回滚失败的Rails迁移?我希望这rake db:rollback会撤消失败的迁移,但是不,它会回滚以前的迁移(失败的迁移减去一个)。而且rake db:migrate:down VERSION=myfailedmigration也不起作用。我已经遇到过几次了,这非常令人沮丧。这是我做的一个简单测试,可以重复该问题:

class SimpleTest < ActiveRecord::Migration
  def self.up
    add_column :assets, :test, :integer
    # the following syntax error will cause the migration to fail
    add_column :asset, :test2, :integer
  end

  def self.down
    remove_column :assets, :test
    remove_column :assets, :test2
  end
end

结果:

== SimpleTest:迁移============================================= ========
-add_column(:assets,:test,:integer)
   -> 0.0932秒
-add_column(:asset,:error)
耙子流产了!
发生错误,所有后来的迁移都被取消:

错误的参数数量(2对3)

好的,让我们回滚一下:

$ rake db:rollback
== AddLevelsToRoles:还原============================================ ==
-remove_column(:roles,:level)
   -> 0.0778秒
== AddLevelsToRoles:恢复(0.0779s)=====================================

嗯?那是我在SimpleTest之前的最后一次迁移,而不是失败的迁移。(哦,如果迁移输出中包含版本号,那就太好了。)

因此,让我们尝试为失败的迁移SimpleTest运行失败:

$ rake db:migrate:down VERSION = 20090326173033
$

什么也没发生,也没有输出。但是也许它还是进行了迁移吗?因此,让我们修复SimpleTest迁移中的语法错误,然后尝试再次运行它。

$ rake db:migrate:up VERSION = 20090326173033
== SimpleTest:迁移============================================= ========
-add_column(:assets,:test,:integer)
耙子流产了!
Mysql :: Error:重复的列名'test':ALTER TABLE`assets` ADD`test` int(11)

不。显然,migrate:down无效。这不是失败,只是没有执行。

除了手动进入数据库并删除它,然后运行测试之外,没有办法摆脱重复的表。有比这更好的方法。


问题答案:

不幸的是,您必须手动清理失败的MySQL迁移。MySQL不支持事务数据库定义更改。

Rails 2.2包括针对PostgreSQL的事务迁移。Rails 2.3包括SQLite的事务迁移。

这现在并不能真正解决您的问题,但是,如果您可以在将来的项目中选择数据库,我建议您使用支持事务性DDL的数据库,因为它使迁移更加轻松。

更新-在2017年的Rails 4.2.7和MySQL 5.7上仍然如此,这是Alejandro Babio在另一个答案中报告的。



 类似资料:
  • 出身背景 我正在使用命令行界面对DB2运行flyway迁移。我做了很多测试,一切都很好。我添加了一些命令以导致失败。 问题 有人能确认如果迁移失败并且数据库支持DDL,是否应该回滚更改表、删除表或创建表吗?当我测试它时,它看起来像是在同一个flyway脚本中失败后没有回滚更改表添加列语句。

  • 我列出了一个问题“Spring事务失败回滚”。我有一个服务类,它调用2 DAO将数据插入到数据库表中。 我的事务配置: 我的服务和dao定义如下:

  • 我想在aws beanstalk中部署geodjango。 我已经尝试过这个解决方案。它以前工作过。 但现在它显示了这个错误。 以下是完整的错误日志

  • (至少我可以只用名字,跳过时间戳……) 有更简单的方法吗?

  • 我刚刚在配置和充分理解flyway的过程中遇到了这样的情况: 我已成功配置新项目以使用Flyway。 我已成功将测试数据库从版本0迁移到1.0.3。 无法执行到版本1.0.4的迁移。(我试图添加已经存在的列,到目前为止没有问题,是我的错。) 但是,一旦我对相应的脚本进行了必要的更改以使其工作,flyway就会不断显示这样的消息: 由于我不想恢复一个完整的转储并再次应用每一次迁移,只是为了使alte

  • 我正在运行一个Spring boot 2.4.3应用程序,我有一个支持事务的mongob 4集群(我使用run-rs在本地运行它)。我也在使用Spring data mongob。我正在尝试为db迁移集成mongock(最新版本-4.3.8),但我面临一个问题,我无法解决。正如我们所知,最新版本的mongock默认使用事务。我有以下更改集,它只是为我的一个实体创建了一个mongob集合。 运行应用