首页 文章

Heroku rake db:migrate

提问于
浏览
3

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

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

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

2 回答

  • 4

    这可能意味着你曾经运行过一次,但它失败了; mysql中的表更改不是事务性的,因此您可以处于错误状态 . 某些更改可能已经运行,但并非所有更改都已运行 .

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

  • 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能够在事务中回滚(大多数)架构更改,因此您不会留下半应用的迁移 .

相关问题