web-dev-qa-db-ja.com

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

いくつかの展開の問題のため、gitでschema.rbの追跡を停止しました。どういうわけか、これを詰め込み、schema.rbファイルが消えていく途中のどこかで。

データベースまたは移行からschema.rbを再生成する方法はありますか?既存のデータを失いたくない。

126
brad

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

bundle exec rake db:schema:dump
211
mguymon

慎重に、

rake db:schema:dump

現在のDBスキーマをダンプしますFROM the DB。これは、移行に変更を加えた場合、[〜#〜] not [〜#〜]がschema.rbファイルに反映されることを意味します。

移行からスキーマを再作成する場合は、次の手順を実行します。

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
52
gamov
rake db:schema:dump

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

11
pschuegr

Rails 5 Way:

Rails db:schema:dump

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

bundle exec Rails db:schema:dump

注:

in Rails 5では、Railsの代わりにrakeを使用してタスクを生成/実行することをお勧めします。これは覚えておいてください、Rails生成されたタスクの拡張子は.rakelib/tasks/myTask.rakeを参照してください。つまり、これらのタスクはrakeを前に付けて実行することもできます。

6
Kaleem Ullah

schema.rbをローカルで再生成する場合は、大丈夫です。データベーステーブルの構造の表現を保持するだけです。データ自体はこのファイルには含まれていません。

schema.rbファイルを再生成するには、次を実行します:

bundle exec rake db:schema:dump

次に、新しいschema.rbファイルをコミットするだけで、正常な状態になります。

4
Graham Swan

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

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

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

4
Colin Summers

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

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

drop table my_table_name // deleted them indivisully
rake db:migrate
rake db:schema:dump // re-created a new schema
0
R.Cha