Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

ham0215
Webエンジニアやってます。仕事では主にバックエンド開発をRailsで行っています。仕事で使う機会は少ないですが、フロント開発ではReact、Typescriptを使っています。
https://hamchance.com
vis-its
独自技術ideagramを用いて、人々の「創造性」や「目利き力」の定量化を行い、イノベーター人材の発掘/育成、科学的イノベーション創発支援を行っています。
https://visits.world
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away