0

ちょっと奇妙な質問だと思います。すぐ下で問題を説明し、興味のある人のために、ここにたどり着いた経緯を説明する背景を説明します

問題:

私のスキーマは、移行の結果として、同じ列を削除および追加したとマークされるような状態になっています。つまり、schema.rb を比較すると、次のようになります。

-    t.integer  "cut_id"
-    t.datetime "created_at",  :null => false
-    t.datetime "updated_at",  :null => false
-    t.integer  "animal_id"
+    t.datetime "created_at",                     :null => false
+    t.datetime "updated_at",                     :null => false
+    t.integer  "animal_id"
+    t.integer  "cut_id"

問題は、これによって列が追加/削除されるわけではありませんが、このコードを本番環境にプッシュして移行を実行すると、実際に列が削除されなくても、基本的に既存のデータが消去されることです。

これは事実ですか?DB が文字通り 4 つの列を削除してから追加するのか、それとも変更がないことを認識しているのか、誰にもわかりませんか? それらを削除する場合、これを修正し、削除する前にデータを保存して再挿入する方法を誰かが考えられますか? データの消去とその置き換えの間のタイムラグは気にしません。

ここにたどり着いた方法:

基本的に、私は急いでばかなので、必要なすべてのデータを新しいテーブルに移行するために必要ないくつかの列を消去したことに気付く前に、多くの移行を含むローカルで大量の変更を加えました。

幸いなことに、これはローカルにありました。残念ながら、作業を破棄するために git reset HEAD^ を実行しましたが、移行が消えたにもかかわらず、スキーマは問題のある移行後の状態のままで、リセットなどはできませんでした。そのため、古い移行を回復してロールバックしようとするこのプロセス全体を実行し、半分は成功しました。次に、他の移行を記述して、半ロールバックした変更を完全にロールバックしました。

このたった1つの問題の結果として、巨大な混乱。結局、それは問題ではなく、簡単に展開/スリープできる可能性はありますか?

4

1 に答える 1

1

したがって、ここには移行とスキーマという 2 つの異なる問題があります。列を削除する移行を実行すると、列に含まれるデータと同様に、列が削除されます。したがって、おそらく移行を編集し、保持したい列を削除する移行を削除または編集する必要があります。保持したいデータが移行によって削除されないように、非常に注意してください。

rake タスク (rake db:schema:load) を使用してスキーマを明示的にロードしない限り、schema.rb は基本的に本番データベースとは無関係です。それはあなたのデータを一掃しますが、一般的なルールとして、本番システムに対して行うことではありません.

于 2013-11-07T05:45:47.627 に答える