「rakedb:migrate」を実行して、schema.dbをデータベーススキーマと再同期しました。しかし、私のテーブルの1つがすでに存在していると言って失敗しました。テーブルを作り直そうとしていたと思います。Railsとは関係なくデータベースに加えた変更を反映するようにschema.rbを更新したいだけの場合、「rake db:migrate」でない場合は、どのコマンドを使用する必要がありますか?そして、この種のことに関するドキュメントの最良の情報源は何ですか?
7 に答える
「rake db:migrate」は、プロジェクトのすべての未処理の移行を試みて実行します。スキーマをダンプするだけの場合は、「rake db:schema:dump」を実行します。
しかし、テーブルが既に存在するという問題があると思います。追加しようとしているテーブルがデータベースに既に存在するため、移行の 1 つが失敗しています。手で作成しましたか?移行を停止しましたが、それについての停止は書かれていませんか? 今後の移行を作成する前に、これを修正する必要があります。それが単なる間違いで、テーブルがそこにあり、正しいので、これを無視したい場合。私のお勧めは、失敗した移行の create table をコメントアウトして、ハックすることです。次に、「rake db:migrate」を実行します。その後、テーブルを作成します。これにより、スキーマのバージョンが更新されます。
すべての移行について適切なダウンを必ず書いてください。
試す
RAILS_ENV=development rake db:drop
前
RAILS_ENV=development rake db:migrate
そして幸せになる!
データベース/テーブルが削除されるため、テスト環境または開発環境で実行するようにしてください。
ときどき、少しおかしくなったときに、Rails が既に完了していると見なすべきマイグレーションを実行したいという状況に陥ることがあります (テーブルが既に存在するなど)。移行の番号 (ファイル名の先頭にある数字の部分) を見つけて、mysql に移動し、次のようなクエリを発行することで、移行を完了としてマークできます。
insert into schema_migrations values('20090521153438');
(または移行の数が何であれ)
または、Desert の migrate_plugin を使用して実行されているプラグインの移行の場合:
insert into plugin_schema_migrations values('my_plugin', '005');
rake db:migrate:reset
すべてのテーブルを削除し、すべての移行を実行して新しいschema.rb
ファイルを作成します。
rake db:schema:dump
またはを試してくださいrake db:migrate:redo
。
を使用し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
移行を再度実行したり、テーブルを削除したり (テーブル内のデータが失われることを意味します) せずにファイルを再作成するため、最初に試すことができる侵襲性が最も低い方法です。
ドキュメントに関する最後の質問に答える:
- Rails 2.1以降のRailsレーキタスクのガイド:http ://www.tutorialspoint.com/ruby-on-rails-2.1/rails-and-rake.htm
- 移行に関する優れたスクリーンキャスト:http://railscasts.com/episodes/107-migrations-in-rails-2-1