Heroku rake db:migrate

时间:2013-02-16 03:05:55

标签: ruby-on-rails ruby heroku

Heroku告诉我,有些迁移尚未运行,但显然已经存在。它似乎落后于一次迁移。我怎么能解决这个问题。

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

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

2 个答案:

答案 0 :(得分:4)

这可能意味着你曾经跑了一次,但它失败了; mysql中的表更改不是事务性的,因此您可以处于错误状态。有些变化可能已经开始,但不是全部。

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

答案 1 :(得分:1)

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

  • 使用dbconsole撤消已应用的更改,然后再次运行迁移,或
  • 使用dbconsole手动更改剩余的架构,然后将记录插入schema_migrations表。

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

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

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

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