2013-10-16 12 views
7

gitに複数のブランチがあります。これらのブランチのスキーマは異なるバージョンになっています。 ブランチに切り替えた後にrake db:setupを実行すると、移行が保留中の場合はnew_featureとなり、保留中の移行を実行するようアドバイスします。rake db:migrate削除されたテーブルでschema.rbを更新する

これを実行すると、同じブランチで削除されたテーブルでスキーマが更新されます。

私がrake db:resetを実行すると、正常に動作します。

私はdb:setupdb:resetの違いを知っています。スキーマは必ずいくつかのレールの知識w.r.t.をしないのですが、それらのrake db:migrate

アムにテーブルを落とし現れる理由 後の1はdb:drop、その後db:setup

を行います。しかし疑問に思ってスキーマの読み込みと移行のプロセス

洞察は大きな助けになるでしょう。事前にありがとう

答えて

5

あなたのschema.rbがgitにチェックインされているようですが、これは良いことです。したがって、ブランチを切り替えると、あなたのschema.rbは実際のdbスキーマとは異なります。

rake db:migrateはschema.rbのスキーマバージョンのみをチェックし、データベースバージョンがより若い場合はとなり、すべての「保留中の」移行が実行されます。移行が実行されている場合のみ、schema.rbファイルが再生成されます。

あなたの実際のスキーマがschema.rbで報告されたバージョンよりも高いバージョンにある場合、唯一の安全なことはありません。その根拠は、それを最新にするための移行ファイルがないかもしれないということです。そうしないと、データベース操作によってテーブル/トランケートなどを再現させる可能性があります。他のバージョンのミスマッチのケースもありますが、あなたはそのアイデアを得ると思います。

ブランチ間でデータを保持する場合は、移行の考え方で作業するいくつかのオプションがあります。

A)ブランチ間で必要なデータはすべて、dbシードファイルに保存されます。次に、dbを削除/作成することができます。

B)ブランチを切り替える前に、異なる移行をロールバックします。新しい支店で再び彼らを転がす。

C)cheatを実行し、schema.rbを削除してrake db:migrateを再実行してください。これは、データの損失、バージョンコントロール内の不明瞭なschema.rb、他のチームメンバーの頭痛の原因となります。これは、移行が意味をなさないためです。

そして助言の言葉。 gitにコミットした場合は、古い移行ファイルを変更しないでください。ちょうど新しいものを作りなさい。論理スタックは、スキーマを順番に変更するためのものです。

関連する問題