web-dev-qa-db-ja.com

Rails rake db:migrateは効果がありません

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

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

30
Jack Hoge

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

移行するたびに、schema_migrationsテーブルに、ID番号に対応する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

移行に誤りがある場合は、コンソールに例外が表示されます。移行は自動的にロールバックされているので、正しくなるまで何度でも実行できるはずです。

64
tadman

spring stopを呼び出すと、問題が解決する可能性があります。

1
limlim

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

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

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

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

0
Gaurav

さて、私は私の問題の原因を突き止めました。私はslim_scrooge gemを使用しており、コメントアウトするとすべてが正常に進行します。理由はわからないけど...

0
Jack Hoge

Redmineのプラグインを使用して移行しているときに、今日同様の問題に直面しました

rake redmine:plugins:migrate Rails_ENV=production NAME=plugin_name

ここで、plugin_nameは実際にはプラグインのinit.rbで定義されたプラグイン名です。

私は4時間も苦労して、ようやく私のプラグインディレクトリ名がプラグイン名と同じではないことに気付きました(注redmine_プレフィックス):

~/redmine/plugins/redmine_plugin_name

したがって、プラグインがプラグイン名にちなんだ名前のフォルダに配置されていることを確認してください。他のRailsアプリにも当てはまると思います。

0
Anton R