エラー文
テーブル作成のため、モデルとともに作成されたマイグレーションファイルに、型とカラム名を書き、rails db:migrate
を実行した。
するとターミナルが以下のようなエラーを吐き出した。
xxxxxx@yyyyyy testApp % rails db:migrate
== 20240404111608 DeviseCreateUsers: migrating ================================
-- create_table(:users)
rails aborted!
StandardError: An error has occurred, all later migrations canceled: (StandardError)
Mysql2::Error: BLOB, TEXT, GEOMETRY or JSON column 'profile' can't have a default value
/Users/code/Desktop/xxxxx/project_2.0/testApp/db/migrate/20240404111608_devise_create_users.rb:5:in `change'
Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: BLOB, TEXT, GEOMETRY or JSON column 'profile' can't have a default value (ActiveRecord::StatementInvalid)
/Users/code/Desktop/xxxxx/project_2.0/testApp/db/migrate/20240404111608_devise_create_users.rb:5:in `change'
Caused by:
Mysql2::Error: BLOB, TEXT, GEOMETRY or JSON column 'profile' can't have a default value (Mysql2::Error)
/Users/code/Desktop/xxxxx/project_2.0/testApp/db/migrate/20240404111608_devise_create_users.rb:5:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
エラー内容と原因
エラー内容
一文目
rails aborted!
StandardError: An error has occurred, all later migrations canceled: (StandardError)
これは、Railsのマイグレーション実行中に標準エラー(StandardError)が発生したことを意味しており、それによってマイグレーションが中断され、以降のマイグレーションがキャンセルされた状態を示している。
原因
以降を見てみよう。
Mysql2::Error: BLOB, TEXT, GEOMETRY or JSON column 'profile' can't have a default value
エラーの原因は、MySQLではBLOB, TEXT, GEOMETRY, または JSONタイプ(型)のカラムにデフォルト値を設定することができないが、設定されているということだ。
解決策
マイグレーションファイルを見てみよう。
db/migrate/20240404111608_devise_create_users.rb
# frozen_string_literal: true
class DeviseCreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name, null: false, default: ""
t.text :profile, null: false, default: ""
t.text :occupation, null: false, default: ""
t.text :position, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
# 省略
textタイプ(型)に、null: false, default: ""
とデフォルト値が設定されていた。
従って、以下のようにtextタイプ(型)から、null: false, default: ""
を削除すれば良い。
db/migrate/20240404111608_devise_create_users.rb
# frozen_string_literal: true
class DeviseCreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name, null: false, default: ""
t.text :profile
t.text :occupation
t.text :position
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
# 省略
このように、デフォルト値を指定しない記述に変更すれば解決する。
修正後はrails db:migrate
コマンドでマイグレーションを実行すればクリア。