3

Heroku 告诉我,有些迁移还没有运行,而显然它们已经运行了。看起来它落后于一次迁移。我怎么能解决这个问题。

当我运行rake db:migrate它告诉我rake aborted Mysql2::Error: Duplicate column name。我知道这些字段已经创建,也很确定迁移已经运行,因为这些字段在任何其他迁移中都不存在,并且 rake db:migrate 在我的本地系统上运行得很好。

我怎样才能解决这个问题?我认为 Heroku 只是没有意识到它已经进行了迁移。我怎么能告诉它“你已经运行了迁移 xxx”?

4

2 回答 2

4

这可能意味着您运行了一次,但失败了;mysql 中的表更改不是事务性的,因此您可能会处于不良状态。一些更改可能已经运行,但不是全部。

您唯一能做的就是确定哪些部分已经运行,在迁移中注释掉那些行,提交并推送并运行迁移,绕过已经运行的部分。

于 2013-02-16T03:20:53.917 回答
1

如果迁移未完全应用,请执行以下操作之一:

  • 使用 dbconsole 撤消已应用的更改,然后再次运行迁移,或者
  • schema_migrations使用 dbconsole 手动更改剩余的模式,然后在表中插入一条记录。

根据迁移脚本中的更改类型,您需要确定以上哪一项最简单。如果已应用的更改是破坏性更改,例如删除列或表,您可以重新创建列或表,以便迁移能够运行。如果剩余的更改很容易转换为 SQL,那么这可能会更容易。

向表中插入一条记录schema_migrations将使应用程序认为迁移已成功应用。仅当您完全满意迁移更改已完全应用时才执行此操作。它有一列,version,需要包含迁移文件名的数字部分。

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html http://guides.rubyonrails.org/migrations.html

最后,这是一个为什么你应该使用 Postgres 而不是 MySQL 的例子。Postgres 能够回滚事务中的(大多数)模式更改,因此您不会被半应用迁移。

于 2013-02-16T04:01:16.910 回答