Edited at

マイグレーションファイルに重複カラムを書いてしまった時の挙動(rails5とrails6の違い)

下記のようなマイグレーションファイルを作成しました。

実行したらどうなるでしょうか?

環境:Rails 5.2.3, mysql 8.0.16


db/migrate/20190731062120_hoge.rb

class Hoge < ActiveRecord::Migration[5.2]

def change
create_table :hoges do |t|
# nameが重複しているぞ!!!
t.string :name
t.string :name
end
end
end

あれ、成功した?!

# bundle exec rake db:migrate

== 20190731062120 Hoge: migrating =============================================
-- create_table(:hoges)
-> 0.0471s
== 20190731062120 Hoge: migrated (0.0512s) ====================================

SQLを見ると重複カラムが除かれているみたいです。

意図して除いているのかhashのkeyみたいになっていて意図せず上書きされちゃっているのかコードを見ていないのでわかりませんが正常に動作します。


log/development.log

CREATE TABLE `hoges` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255))


で、同様のコードをrails6でマイグレーションしてみましょう。

環境:Rails 6.0.0.rc1, mysql 8.0.16


db/migrate/20190731053302_hoge.rb

class Hoge < ActiveRecord::Migration[6.0]

def change
create_table :hoges do |t|
t.string :name
t.string :name
end
end
end

お、エラーになった。

rails6からは重複しているカラムを除いてくれなくなったみたいです。

# bundle exec rake db:migrate

== 20190731053302 Hoge: migrating =============================================
-- create_table(:hoges)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

you can't define an already defined column 'name'.

1テーブルに同じ名前のカラムを書くことはないのでバグですが、正常終了してしまうため気づかずに潜んでいる可能性があります。

Rails6にバージョンアップしたらrake db:migrateで1からデータベースを作成しなおしてみたほうがよさそうです。