31

今日、新しい Rails 3 アプリを作成し、簡単な移行を追加しましたが、何らかの理由で、rake db:migrate を実行しても何も起こりません。数秒間一時停止してから、コマンド プロンプトに戻りますが、エラーなどは発生しません。Schema.rb とデータベースは空のままです。

何が起こっているのでしょうか?私は多くのアプリを作成しましたが、この問題は一度もありませんでした。すべてが完全に標準的なセットアップです。

4

5 に答える 5

69

移行が実行されない理由はいくつかありますが、最も一般的なのは、定義したすべての移行が既に実行されているという印象をシステムが既に受けていることです。

移行ごとに、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

移行に誤りがある場合は、コンソールにリストされた例外が表示されます。移行は自動的にロールバックされるため、問題が解決するまで何度でも実行できます。

于 2011-04-08T20:13:56.333 に答える
1

私は同じ問題に直面しました。私は私を助けた一種の短いハックをしました。誰かが短くて甘い解決策を望んでいる場合に備えて、投稿しています。タッドマンの言うことに同意する

「システムは、定義したすべての移行がすでに実行されているという印象を受けています」

私がしたことは、/app_folder/db/migrateフォルダー内の移行ファイルの名前を変更することでした。ruby migrateファイルの名前の数字部分は、ファイルが作成された時刻だと思います。

移行を再実行するたびに、たとえば 1 をファイル名に追加できます。名前を変更した後、テーブルをドロップ/削除し(削除にはmysqlコマンドラインツールを使用しました)、rake db:migrateを実行すると、移行が完了するはずです。

于 2015-04-13T16:08:05.257 に答える
0

さて、私は自分の問題の原因を突き止めました。私はslim_scroogegemを使用していて、コメントアウトするとすべてが正常に進行します。理由はわかりませんが...

于 2011-04-09T09:46:46.983 に答える