Heroku告诉我,有些迁移尚未运行,但显然已经存在。它似乎落后于一次迁移。我怎么能解决这个问题。
当我运行rake db:migrate
时,它会告诉我rake aborted Mysql2::Error: Duplicate column name
。我知道这些字段已经创建,也非常确定迁移已经运行,因为这些字段在任何其他迁移中都不存在,并且rake db:migrate在我的本地系统上运行正常。
我该如何解决这个问题?我认为Heroku只是没有意识到它已经进行了迁移。我怎么能告诉它“你已经运行了迁移xxx”?
答案 0 :(得分:4)
这可能意味着你曾经跑了一次,但它失败了; mysql中的表更改不是事务性的,因此您可以处于错误状态。有些变化可能已经开始,但不是全部。
您唯一能做的就是确定已运行的部分,在迁移中注释掉这些部分,提交并推送并运行迁移,绕过已经运行的部分。
答案 1 :(得分:1)
如果未完全应用迁移,请执行以下操作之一:
schema_migrations
表。根据迁移脚本中的更改类型,您需要确定上述哪个更容易。如果已应用的更改是破坏性更改(例如删除列或表),则可以重新创建列或表,以便能够运行迁移。如果剩下的更改很容易转换为SQL,那么这可能会更容易。
将记录插入schema_migrations
表将允许应用程序认为已成功应用迁移。仅当您完全满意迁移更改已完全应用时才执行此操作。它有一列version
,需要包含迁移文件名的数字部分。
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html http://guides.rubyonrails.org/migrations.html
最后,这是为什么你应该使用Postgres而不是MySQL的一个例子。 Postgres能够在事务中回滚(大多数)架构更改,因此您不会留下半应用的迁移。