2013-02-16 165 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能夠在事務中回滾(大部分)模式更改,因此您不會留下半應用的遷移。

相關問題