読者です 読者をやめる 読者になる 読者になる

naichi's lab

3日後の自分(他人)への書き置き

【Rails4、SQLite】Cannot add a NOT NULL column with default value NULL

Ruby on Rails 4 SQLite3

f:id:naichilab:20160416193657p:plain

こつこつRailsやってます。 今日はこんなエラーに遭遇。

エラー

SQLite3を使う環境でrake db:migrateしたらこんなエラー。

== 20160105034748 AddColumnToUser: migrating ==================================
-- add_column(:users, :permalink, :string, {:null=>false, :after=>:id})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "users" ADD "permalink" varchar NOT NULL/Users/naichi/unity-room/vendor/bundle/ruby/2.2.0/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize'

default value NULLのままじゃNOT NULL制約のついた列追加させねーよ!!って言ってるみたいですね。

明示的に決めさせるためにNOT NULL付けるんだよ!!defaultつけたら意味ないんだよ!!

確認

対象のmigrateファイルはこんな感じ。

class AddColumnToUser < ActiveRecord::Migration
  def change
    add_column :users, :permalink, :string, :null => false, :after => :id
  end
end

対応

列追加と制約付与を別々に書いた。

class AddColumnToUser < ActiveRecord::Migration
  def up
    add_column :users, :permalink, :string, :after => :id
    change_column :users, :permalink, :string, :null => false
  end
  def down
    remove_column :users, :permalink
  end
end

これでイケるとかどうなってんだよSQLite。。。