こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在4社経験している、11年目エンジニアです。
この記事では、 Ruby on Railsでマイグレーションを実行する
1 |
rails db:migrate |
のrailsコマンドを実行したとき
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
== 20210225124217 CreateUsers: migrating ====================================== -- create_table(:users) rails aborted! StandardError: An error has occurred, this and all later migrations canceled: you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table. C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:4:in `block in change' C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:3:in `change' bin/rails:4:in `<main>' Caused by: ArgumentError: you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table. C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:4:in `block in change' C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:3:in `change' bin/rails:4:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace) |
というエラーメッセージが表示されたときの原因と解決方法をお伝えします。
エラーが発生した原因
エラーメッセージ「you can’t redefine the primary key column ‘id’.」が発生してしまった原因は、マイグレーションファイルでidを指定していることです。
先ほどエラーを出したマイグレーションファイルは下記です。
1 2 3 4 5 6 7 8 9 10 |
class CreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| t.integer :id t.string :name t.timestamps end end end |
なぜこれがダメなのか?と言いますと、idはマイグレーションファイルに記載がなくても必ず作成され、Active Recordモデルにおけるデフォルトの主キーだからです。
なのでマイグレーションファイルにidを記載する、ということはidというカラムを再定義するためエラーとなっていた、というわけです。
解決する方法
解決する方法は、
- 「id」というカラム名を変更する
- 「id」の記載を削除する
の2パターンです。
この記事では先ほど例にあげたマイグレーションファイルは、下記のようにidの記載を削除します。
1 2 3 4 5 6 7 8 9 |
class CreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| t.string :name t.timestamps end end end |
上記の状態で
1 |
rails db:migrate |
を実行するとマイグレーションを実行することができます!
1 2 3 4 |
== 20210225124217 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0028s == 20210225124217 CreateUsers: migrated (0.0035s) ============================= |
まとめ:エラーが出ても落ち着いて、対処しよう
以上がRuby on Railsで
1 |
rails db:migrate |
コマンドを実行したとき
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
== 20210225124217 CreateUsers: migrating ====================================== -- create_table(:users) rails aborted! StandardError: An error has occurred, this and all later migrations canceled: you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table. C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:4:in `block in change' C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:3:in `change' bin/rails:4:in `<main>' Caused by: ArgumentError: you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table. C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:4:in `block in change' C:/rails_study/sample/db/migrate/20210225124217_create_users.rb:3:in `change' bin/rails:4:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace) |
というエラーメッセージが表示されたときの原因と解決策でした!
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント