web-dev-qa-db-ja.com

rake db:migrateは、schema.rbをデータベーススキーマと再同期するための正しいコマンドですか?

「rakedb:migrate」を実行して、schema.dbをデータベーススキーマと再同期しました。しかし、私のテーブルの1つがすでに存在していると言って失敗しました。テーブルを作り直そうとしていたと思います。 Railsとは関係なくデータベースに加えた変更を反映するようにschema.rbを更新したいだけの場合、「rakedb:migrate」でない場合はどのコマンドを使用する必要がありますか?そして、この種のことに関するドキュメントの最良の情報源は何ですか?

17
drizzle

「rakedb:migrate」は、プロジェクトのすべての未解決の移行を試行して実行します。スキーマをダンプしたいだけの場合は、「rakedb:schema:dump」を実行してください。
しかし、テーブルがすでに存在すると表示されるという問題があると思います。追加しようとしているテーブルがデータベースにすでに存在するため、移行の1つが失敗しています。手作業で作成しましたか?移行をダウンしましたが、ダウンを記述していませんか?将来の移行を作成する前に、これを修正する必要があります。それが単なる間違いであり、テーブルがそこにあり、正しいので、これを無視したい場合。失敗した移行でcreateテーブルをコメントアウトして、ハックすることをお勧めします。次に、「rakedb:migrate」を実行します。次に、テーブルを作成します。これにより、スキーマのバージョンが更新されます。
すべての移行で適切なダウンを書き込むようにしてください。

19
scottd

試してみてください

Rails_ENV=development rake db:drop

Rails_ENV=development rake db:migrate

そして幸せになる!

データベース/テーブルが削除されるため、テスト環境または開発環境で実行するようにしてください

18
crmoreira

ときどき、状況が少し変わったときに、Railsが、すでに実行されていると考えるべき移行を実行したいという状況に陥ることがあります(テーブルはすでに存在しますなど)。移行の番号(ファイル名の先頭にある番号の部分)を見つけ、mysqlに移動して、次のようなクエリを発行することで、移行を完了としてマークできます。

insert into schema_migrations values('20090521153438');

(または移行の数が何であれ)

または、Desertのmigrate_pluginを使用して実行されているプラ​​グイン移行の場合:

insert into plugin_schema_migrations values('my_plugin', '005');
15
hoff2

rake db:migrate:resetはすべてのテーブルを削除し、すべての移行を実行して、新しいschema.rbファイルを作成します。

6
Mike

rake db:schema:dumpを使用します。

$ rake -T | grep schema
rake db:schema:dump # Create a db/schema.rb file that is portable
                    #  against any database supported by ActiveRecord

rake db:schema:dumpは、移行を再度実行したり、テーブルを削除したりせずにdb/schema.rbファイルを再作成するため(これらのテーブルのデータが失われることを意味します)、最初に試すことができる最も侵襲性の低い方法です。

2
Thomas Klemm

rake db:schema:dumpまたはrake db:migrate:redoを試してください。

2
pts

ドキュメントに関する最後の質問に答える:

1