schema.rbを紛失しました!再生できますか?


133

デプロイの問題のため、gitでschema.rbの追跡を停止しました。どういうわけか、私はこれを詰め込み、schema.rbファイルが消えた途中でどこかに詰めました。

データベースまたはマイグレーションからschema.rbを再生成する方法はありますか?既存のデータを失わないようにしたいと思います。

回答:


230

実行するrake -Tと、Railsプロジェクトで可能なすべてのRakeタスクがリストされます。それらの1つは、データベースからRailsアプリのschema.rbを再作成するdb:schema:dumpです。

bundle exec rake db:schema:dump

ありがとうございます。多くの回答がありましたが、あなたが最初(ちょうど)だったようです。奇妙なことに、これはデータベース自体から、または移行からスキーマを生成しますか?
ブラッド

7
データベース自体から、移行以外で発生した変更がある場合は注意してください。
mguymon 2012年

1
schema.rbにはrake db:schema:dump、rails 2.0の後も空のスキーマが含まれています
Will Hardwick-Smith、

上記のコマンドを実行した後もschema.rbファイルはまったく同じままです
stevec

59

注意深く

rake db:schema:dump

現在のDBスキーマダンプしますDB FROMを。これは、マイグレーションに変更を加えた場合、それらがschema.rbファイルに反映されないことを意味します。これはIMOに必要なものではありません。

移行からスキーマを再作成する場合は、以下を実行します。

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
それはデータの損失につながり、OPはそれを避けたいと言った。さらに、Colinが指摘しているように、(一般的に言えば)奇妙な依存関係の問題に遭遇する可能性が高まるため、移行から純粋にデータベースを再生成することは潜在的に非常に悪い考えです。保留中の移行がある場合は、開発マシンで最後の移行を実行してからrake db:schema:dumpコマンドを実行するのが最善の方法です。
ポールリヒター

4
すべてのキャンバスは私の答えで明確に説明されています。schema:dumpのみを実行し、クリーンなスキーマを取得しないことで、正確に噛まれました。OPはCVSでスキーマを追跡することについて話している。私のスキーマを、移行での定義に合わせて、本番DBや古い開発DBからの古いバージョンではないようにしたい
gamov

11
rake db:schema:dump

これはRails 3でも引き続き有効だと思います。データベースからschema.rbを再生成します。


8

RAILS 5ウェイ:

rails db:schema:dump

または、Gem :: LoadErrorに遭遇した場合:

bundle exec rails db:schema:dump

注意:

レール5に使用して実行/タスクが生成されることが推奨されるrails代わりにrake、これは単に覚えておくことで、生成されたタスクをレールの延長である.rakeに表示lib/tasks/myTask.rake。つまり、これらのタスクは先頭に追加することでも実行できrakeます。


5

あなたが再生した場合 schema.rbローカルで、問題はありません。データベーステーブルの構造の表現を保持するだけです。データ自体はこのファイルに含まれていません。

schema.rbファイルを再生成するには、次のコマンドを実行します。

bundle exec rake db:schema:dump

次に、新しいschema.rbファイルをコミットするだけで、問題はなくなります。


4

schema.rbファイル自体から直接:

別のシステムにアプリケーションデータベースを作成する必要がある場合はdb:schema:load、すべての移行を最初から実行するのではなく、を使用する必要があります。後者は欠点があり、持続不可能なアプローチです(移行が増えるほど、実行が遅くなり、問題が発生する可能性が高くなります)。

そのためrake db:migrate、この執筆時点で最低評価の回答で提案されていたの提案は行わないでください。


スキーマを再生成する前に開発マシンに保留中のマイグレーションがある場合は、最後のいくつかの保留中のマイグレーションを実行することをお勧めしますが、マイグレーションから純粋にデータベースを再生成することは、特にデータの損失につながるため、非常に悪い考えです。
ポールリヒター

1

移行を削除しても、古いスキーマが更新されないという同様の問題もありました。

したがって、私がしたことは、データベース内のすべての既存のテーブルを削除し、それらを再度移行することでした。次に、「db:schema:load」コマンドを実行すると、新しいschema.rbが得られました。

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.