LoginSignup
37
38

More than 5 years have passed since last update.

Rails db migrate でエラーになったときの調査方法

Last updated at Posted at 2017-11-22

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で書いたものがうまく動いてなかったりすると、何度も実行している間にテーブルの状態が想定と異なってきて何がおかしいのか分からなくなってくるので注意。

詰まっているときは、マイグレーションファイルの中でもテストしたい箇所以外はコメントアウトして確認すると良い。

37
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
38