3

Herokuは、明らかに実行されているのに、実行されていない移行があると言っています。1回の移行の背後にあるようです。どうすればこの問題を解決できますか。

私が実行するrake db:migrateと、それは私に教えてくれrake aborted Mysql2::Error: Duplicate column nameます。これらのフィールドはすでに作成されていることを知っています。また、これらのフィールドは他の移行には存在せず、rake db:migrateはローカルシステムで問題なく実行されるため、移行が実行されたことを確認します。

どうすればこれを修正できますか?Herokuは、その移行がすでに実行されていることに気づいていなかったと思います。「すでに移行xxxを実行しました」とはどうすればわかりますか?

4

2 に答える 2

4

これはおそらく、一度実行したことを意味しますが、失敗しました。mysqlでのテーブルの変更はトランザクションではないため、悪い状態のままになる可能性があります。一部の変更が実行された可能性がありますが、すべてではありません。

実行できる唯一のことは、すでに実行されている部分を判別し、移行でそれらの行をコメントアウトし、すでに実行されている部分をバイパスして、移行をコミットしてプッシュして実行することです。

于 2013-02-16T03:20:53.917 に答える
1

移行が不完全に適用されている場合は、次のいずれかを実行します。

  • dbconsoleを使用して、適用された変更を元に戻し、その後、マイグレーションを再実行するか、または
  • dbconsoleを使用して残りのスキーマを手動で変更してから、テーブルにレコードを挿入しschema_migrationsます。

移行スクリプトに含まれる変更の種類に応じて、上記のどれが最も簡単かを判断する必要があります。すでに適用されている変更が、列またはテーブルの削除などの破壊的な変更である場合は、移行を実行できるように列またはテーブルを再作成できます。残りの変更をSQLに変換するのが簡単な場合は、それが簡単な場合があります。

テーブルにレコードを挿入するschema_migrationsと、アプリは移行が正常に適用されたと見なすことができます。これは、移行の変更が完全に適用されたことに完全に満足している場合にのみ行ってください。1つの列versionがあり、移行ファイル名の数値部分を含める必要があります。

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

最後に、これはMySQLの代わりにPostgresを使用する必要がある理由の例です。Postgresはトランザクション内の(ほとんどの)スキーマ変更をロールバックできるため、半分適用された移行が残ってしまうことはありません。

于 2013-02-16T04:01:16.910 に答える