2013-02-16 108 views
3

Heroku告诉我,有些迁移没有运行,当他们已经明确了。它看起来像是在一次迁移之后。我怎么能解决这个问题。Heroku rake db:migrate

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

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

+1

删除有问题的迁移文件并转到更有趣的问题? – 2013-02-16 03:20:03

回答

4

这可能意味着你跑了一次,但失败了; mysql中的表变更不是事务性的,所以你可能会处于一个糟糕的状态。一些更改可能已经运行,但不是全部。

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

+0

是的,这就是我目前正在做的。我只是觉得很奇怪,如果它之前运行并且失败了,那么为什么所有这些字段都会将其加入数据库? – botbot 2013-02-16 03:26:13

+0

+1欣赏答案的人。 – botbot 2013-02-16 03:26:32

1

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

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

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

将记录插入schema_migrations表中将允许应用程序认为迁移已成功应用。只有当您完全满意迁移变更完全适用时才这样做。它有一列version,它需要包含迁移文件名的数字部分。

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

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

相关问题