Railsアプリでのマイグレーションエラーまとめ
概要
Railsアプリでmigrateする際のエラーの対処をまとめる。
エラー対処
Mysql2::Error: Duplicate column name 【カラム名】
カラムが重複してるからmigrateできないという意味
原因
ブランチを行き来したことで起こったのですが、原因は分かっていません。分かり次第、更新します!
エラー解決
1. 重複しているカラムを保存しようとしているマイグレーションファイルを見つける。
class AddCoulmnToOrganizationKeywords < ActiveRecord::Migration[6.1] def change add_column :users, :name, :string end end
2. そのマイグレーションファイルの中身をchangeメソッドを空にする。
class AddCoulmnToOrganizationKeywords < ActiveRecord::Migration[6.1] def change # 空にする end end
Mysql2::Error: Can't DROP 【インデックス名】; check that column/key exists
【インデックス名】が削除できないから、カラム等を確認してほしいという意味
原因
エラー解決
1. エラーが起こった【インデックス名】で活用しているカラムを持つマイグレーションファイルをmigrateする。
rails db:migrate VERSION=【マイグレーションID】
2. 1.のマイグレーションファイルに依存したマイグレーションファイルを先にロールバックする。
rails db:migrate:down VERSION=【マイグレーションID】
Mysql2::Error: Table 【テーブル名】 doesn't exist
【テーブル名】が存在しませんという意味
原因
- マイグレーションファイルAをロールバック
- マイグレーションファイルAで作成したテーブルに依存しているマイグレーションファイルBをロールバック
- マイグレーションファイルAで作成したテーブルが見つからず、エラーが起こる。
エラー解決
1. エラーが起こった【テーブル名】を持つマイグレーションファイルをmigrateする。
rails db:migrate VERSION=【マイグレーションID】
2. 1.のマイグレーションファイルに依存したマイグレーションファイルを先にロールバックする。
rails db:migrate:down VERSION=【マイグレーションID】
Index name 【インデックス名】 on table 【テーブル名】 is too long; the limit is 64 characters
【テーブル名】の中の【インデックス名】が長過ぎるから64文字までに抑えてという意味
原因
- 以下のようなマイグレーションファイルを作成
class CreateTableAs < ActiveRecord::Migration[6.1] def change create_table :table_a do |t| t.references :table_b end end end
rails db migrate
を行う。- t.references で知らない内にインデックスが作成されようとする。(今回の場合は、
index_table_a_on_table_b_id
が作成される。) - インデックス名が64文字以上あり、エラーで弾かれる。
エラー解決①
t.references
にindexオプションを付与し、インデックス名を指定する。
class CreateTableAs < ActiveRecord::Migration[6.1] def change create_table :table_a do |t| t.references :table_b, index: { name: 'idx_table_a_on_table_b_id' } end end end
エラー解決②
t.references
にindexオプションを付与し、falseを指定する。
class CreateTableAs < ActiveRecord::Migration[6.1] def change create_table :table_a do |t| t.references :table_b, index: false end end end
最後に
改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。
ここまで読んで下さりありがとうございました〜