今日、新しい Rails 3 アプリを作成し、簡単な移行を追加しましたが、何らかの理由で、rake db:migrate を実行しても何も起こりません。数秒間一時停止してから、コマンド プロンプトに戻りますが、エラーなどは発生しません。Schema.rb とデータベースは空のままです。
何が起こっているのでしょうか?私は多くのアプリを作成しましたが、この問題は一度もありませんでした。すべてが完全に標準的なセットアップです。
今日、新しい Rails 3 アプリを作成し、簡単な移行を追加しましたが、何らかの理由で、rake db:migrate を実行しても何も起こりません。数秒間一時停止してから、コマンド プロンプトに戻りますが、エラーなどは発生しません。Schema.rb とデータベースは空のままです。
何が起こっているのでしょうか?私は多くのアプリを作成しましたが、この問題は一度もありませんでした。すべてが完全に標準的なセットアップです。
移行が実行されない理由はいくつかありますが、最も一般的なのは、定義したすべての移行が既に実行されているという印象をシステムが既に受けていることです。
移行ごとに、ID 番号に対応する列schema_migrations
を持つテーブルにエントリが作成されます。version
移行を強制的に再実行したい場合は、通常、移行を取り消して再試行できます。たとえば、次のようにして20100421175455_create_things.rb
再実行します。
rake db:migrate:redo VERSION=20100421175455
よくある状況は、移行がそもそも実行に失敗した、たとえば例外が生成されたにもかかわらず、Rails がまだ移行が完了したと見なしているということです。強制的に移行を再実行するには、対応するレコードをschema_migrations
テーブルから削除してからrake db:migrate
再度実行します。
今後この種の問題を回避する 1 つの方法は、自動バックアウト手順を使用して移行を定義することです。
class CreateThings < ActiveRecord::Migration
def self.up
# ... (migration) ...
rescue
# If an exception occurs, back out of this migration, but ignore any
# exceptions generated there. Do the best you can.
self.down rescue nil
# Re-raise this exception for diagnostic purposes.
raise
end
end
移行に誤りがある場合は、コンソールにリストされた例外が表示されます。移行は自動的にロールバックされるため、問題が解決するまで何度でも実行できます。
私は同じ問題に直面しました。私は私を助けた一種の短いハックをしました。誰かが短くて甘い解決策を望んでいる場合に備えて、投稿しています。タッドマンの言うことに同意する
「システムは、定義したすべての移行がすでに実行されているという印象を受けています」
私がしたことは、/app_folder/db/migrateフォルダー内の移行ファイルの名前を変更することでした。ruby migrateファイルの名前の数字部分は、ファイルが作成された時刻だと思います。
移行を再実行するたびに、たとえば 1 をファイル名に追加できます。名前を変更した後、テーブルをドロップ/削除し(削除にはmysqlコマンドラインツールを使用しました)、rake db:migrateを実行すると、移行が完了するはずです。
さて、私は自分の問題の原因を突き止めました。私はslim_scroogegemを使用していて、コメントアウトするとすべてが正常に進行します。理由はわかりませんが...