migrationでダウングレード02【悲劇と立ち直り方】
例えば、005_nantoka_kantokas.rb というmigrateファイルがあったとして、その中身が途中で間違っていたとします。
class CreateNantokaKantokas < ActiveRecord::Migration
def self.up
create_table :nantoka_kantokas do |t|
t.column :my_number, :integer
end
execute "alter table nantoka_kantokas add constrainttttttttttttttttt fk_nantoka_kantokas_books
foreign key (my_number) references books(id)"
end
def self.down
drop_table :nantoka_kantokas
end
end
そいでもって、
# rake db:migrate
を実行すると
rake aborted!
Mysql::Error: #42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax
などというエラーがでます。あっ、005_nantoka_kantokas.rb ファイル中の constrainttttttttttttttttt という箇所が間違ってる、と思ってそれを constraint に直して、
# rake db:migrate
を再び実行すると、うまく行くと思いきや、
rake aborted!
Mysql::Error: #42S01Table 'nantoka_kantokas' already exists
と表示されているので、あちゃー、これは、まず、nantoka_kantokas テーブルを消さなきゃ、と思いました。
そこで、バージョンをひとつ前に戻そうとして、
# rake db:migrate VERSION=4
を実行しても、005_nantoka_kantokas.rb ファイルの中の drop_table :nantoka_kantokas は、実行されません。
なぜなら、一番最初に打った、rake db:migrate コマンドは、create_table :nantoka_kantokas まで中途半端に実行されています。
でも、rake db:migrate コマンドは、結局成功しなくて alter table nantoka_kantokas の前で止まってしまいました。
そして、DB の schema_info テーブルの version カラムの値は、5 に上がらず 4 のままだったからです。
なので、一回自分で self.down の分を実行しなければなりません。 mysql プロンプトからテーブルをドロップします。
$mysql drop table nantoka_kantokas
そして、005_nantoka_kantokas.rb ファイルの constrainttttttttttttttttt という部分が constraint に修正されていることを確認して、migrateします。
# rake db:migrate
良かった。動きました。これで今夜は羊を数えずとも眠りに入っていけます。
【広告】