カテゴリー : SQLite

[Ruby on Rails][SQLite3] SQLException: Cannot add a NOT NULL column with default value NULL

Ruby on Rails にて、Usersテーブルに role カラムを NOT NULL 制約を付けて、追加しようとしたらエラーが発生しました。

■ エラーが発生した migration ファイル

db/migrate/20120415053115_add_role_to_users.rb

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :null => false
  end
end

rake db:migrate すると、エラーが発生しました。

■ エラーメッセージ

$ rake db:migrate
==  AddRoleToUsers: migrating ============================
-- add_column(:users, :role, :string, {:null=>false})
rake aborted!
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 "role" varchar(255) NOT NULL
 
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

SQLite3 では、NOT NULL制約を付ける場合にはNULL以外のDEFAULTを指定する必要があるみたいです。

DEFAULT を指定しないと NULL が入ってしまうので、そのせいで今回のエラーが発生したみたいです。

NOT NULL制約を付ける場合にはNULL以外のDEFAULTを指定して下さい

・引用元:さぼてん: SQLite でテーブルの変更・カラムの追加をする-ALTER TABLE はてなブックマーク - さぼてん: SQLite でテーブルの変更・カラムの追加をする-ALTER TABLE

なので、下記のようにカラム追加後に change_column で role カラムを NOT NULL に変更すればOKです。

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :null => false
    change_column :users, :role, :string, :null => false
  end
end

また、素直に DEFAULT を指定してあげるのも一つの手です。

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :null => false, :default => ""
  end
end

以上です。

【参考】

ruby on rails – SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL – Stack Overflow はてなブックマーク - ruby on rails - SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL - Stack Overflow

[SQLite] Firefox アドオン(Add-on)「SQLite Manager」が便利!

SQLite の GUI ツールは Firefox アドオン「SQLite Manager」が便利でオススメです。

・DL:SQLite Manager :: Add-ons for Firefox はてなブックマーク - SQLite Manager :: Add-ons for Firefox

Mac用の SQLite GUI ツールはいくつかあるみたいですが、比較記事を読む限りでも「SQLite Manager」が一番使いやすいんじゃないかなと思ってます。

SQLiteのDBファイルを編集できるGUIツール for OSX – ろばの穴・別館 はてなブックマーク - SQLiteのDBファイルを編集できるGUIツール for OSX - ろばの穴・別館

[Mac][DB]Mac環境でのSQLiteのクライアント比較 | 太のうぇぶでぶ -There is no border in the Internet!- はてなブックマーク - [Mac][DB]Mac環境でのSQLiteのクライアント比較 | 太のうぇぶでぶ -There is no border in the Internet!-

以上です。

[SQLite] SQLiteを操作できるFirefox拡張機能「SQLite Manager」

SQLiteを操作できるFirefox拡張機能「SQLite Manager」が便利だったので、ご紹介します。

・DL:SQLite Manager :: Add-ons for Firefox はてなブックマーク - SQLite Manager :: Add-ons for Firefox

SQLiteを使っているアプリが起動中でも、SQLite Managerからの操作もできて、かなり役立ってます。
 

【参考】

SQLiteを操作できるFirefox拡張機能「SQLite Manager 0.2.4」リリース:CodeZine はてなブックマーク - SQLiteを操作できるFirefox拡張機能「SQLite Manager 0.2.4」リリース:CodeZine

DBViewer Plugin for Eclipse はてなブックマーク - DBViewer Plugin for Eclipse

データベースの利用に便利なEclipseプラグイン – @IT はてなブックマーク - データベースの利用に便利なEclipseプラグイン - @IT

[SQLite] 日本時間(JST)での現在時刻を datetime で取得する

SQLiteにて、現在時刻を日本時間(JST)で取得するには datetime の第二引数に localtime を指定すればOKです。

SELECT datetime('now', 'localtime') AS datetime_jp;

【参考】

SQLite3 での日付処理 はてなブックマーク - SQLite3 での日付処理

SQLiteのTIMESTAMP型のフィールド値をSQLiteのdatetime関数で日本時間に変換 – CLの日記 はてなブックマーク - SQLiteのTIMESTAMP型のフィールド値をSQLiteのdatetime関数で日本時間に変換 - CLの日記