db migrateがうまく行かない時の調査方法についてメモ
1.RAILS_ENVで指定する環境はあっているか
デフォルトはdevelopment
指定する環境と対応するDBはconfig/database.yml
で確認
cmd
bundle exec rake db:migrate RAILS_ENV=test
2.エラーとなっているmigrationファイルを特定する
rake aborted以降をみる
エラー例
example
bundle exec rake db:migrate RAILS_ENV=development
~
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE INDEX `idx_test` ON `tests` (`message`(761))
3.エラーとなったマイグレーションファイルを参照し、必要があれば修正して再実行
ファイル場所:db/migrate/xxxxxxxx.rb
対象のファイルだけ試したい場合は、
以下の手順で実行対象idを特定し、実行する。
※upまたはdownのメソッドを実行するとき、実行時のstatusが実施メソッドと異なる必要がある。(statusがupの状態でup実施しても実行されない。downの時も同様)
migration
bundle exec rake db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20111016164835 Create test
up 20111016164912 Create views
# 実行したいバージョンと実行したい処理(upまたはdown)を指定。
bundle exec rake db:migrate:up VERSION=20111016164835 RAILS_ENV=test
bundle exec rake db:migrate:down VERSION=20111016164912 RAILS_ENV=test
# マイグレーションファイル内のdown実施後、upを行いたいときは'redo'を使用すると楽
bundle exec rake db:migrate:redo VERSION=20111016164912 RAILS_ENV=test
4.上記3つを確認しても分からないときは、生SQLで確認
使用しているDBにターミナルで接続してSQLそのものに問題があるのかmigrateファイルでの実行方法に問題があるのか切り分ける。
dbconsoleの例
# RAILS_ENVは繋ぎたい環境にする
RAILS_ENV=development rails dbconsole
mysqlの例
mysql
# DBを指定したい時は、-Dオプションを使用
mysql -hlocalhost -utest -p
# migrateでエラーとなっているSQLを実行してみる
DROP INDEX idx_test ON tests;
5.その他
マイグレーションのdownで書いたものがうまく動いてなかったりすると、何度も実行している間にテーブルの状態が想定と異なってきて何がおかしいのか分からなくなってくるので注意。
詰まっているときは、マイグレーションファイルの中でもテストしたい箇所以外はコメントアウトして確認すると良い。