LoginSignup
5
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-31

下記のようなマイグレーションファイルを作成しました。
実行したらどうなるでしょうか?
環境: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からデータベースを作成しなおしてみたほうがよさそうです。

5
0
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
5
0