私は新しいRails 3アプリを今日作成し、単純な移行を追加しました。何らかの理由で、rake db:migrateを実行しても何も起こりません。数秒間一時停止してからコマンドに戻りますエラーなどは発生せず、Schema.rbとデータベースは空のままです。
何が起こっているのでしょうか?私は多くのアプリを作りましたが、この問題は一度もありませんでした。すべても完全に標準的なセットアップです。
移行が実行されない理由はいくつかありますが、最も一般的なのは、システムがすでに、定義したすべての移行がすでに実行されているという印象を受けていることです。
移行するたびに、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
移行に誤りがある場合は、コンソールに例外が表示されます。移行は自動的にロールバックされているので、正しくなるまで何度でも実行できるはずです。
spring stop
を呼び出すと、問題が解決する可能性があります。
私も同じ問題に直面しました。私は私を助ける一種の短いハックをしました。誰かが短くて甘い解決策を望んでいる場合に備えて、私はそれを投稿しています。タッドマンが言っていることに同意する
「システムはすでに、定義したすべての移行がすでに実行されているという印象を受けています」
/ app_folder/db/migrateフォルダーにある移行ファイルの名前を変更しました。 Ruby移行ファイルの名前の数字部分は、ファイルが作成された時間だと思います。
移行を再実行するたびに、ファイル名にたとえば1を追加できます。名前を変更した後、テーブルを削除/削除し(mysqlコマンドラインツールを使用して削除しました)、次にrake db:migrateを実行すると、移行が完了するはずです。
さて、私は私の問題の原因を突き止めました。私はslim_scrooge gemを使用しており、コメントアウトするとすべてが正常に進行します。理由はわからないけど...
Redmineのプラグインを使用して移行しているときに、今日同様の問題に直面しました
rake redmine:plugins:migrate Rails_ENV=production NAME=plugin_name
ここで、plugin_nameは実際にはプラグインのinit.rbで定義されたプラグイン名です。
私は4時間も苦労して、ようやく私のプラグインディレクトリ名がプラグイン名と同じではないことに気付きました(注redmine_
プレフィックス):
~/redmine/plugins/redmine_plugin_name
したがって、プラグインがプラグイン名にちなんだ名前のフォルダに配置されていることを確認してください。他のRailsアプリにも当てはまると思います。