RubyでSQLite3使ってみた
Railsで使うときはActiveRecordに隠されててあんまり意識することなかったSQLite3だけど、ちょっと直接使ってみた。
Gemのインストール
Gemfileに以下を書いてbundle install
。
gem 'sqlite3'
使い方
require 'sqlite3' db = SQLite3::Database.new 'test.db' # create table sql = <<-SQL create table users ( id integer primary key, name text ); SQL db.execute(sql) # insert db.execute('insert into users (name) values (?)', 'hitoshi') db.execute('insert into users (name) values (?)', 'masatoshi') # select db.execute('select * from users') do |row| p row end #=> # [1, "hitoshi"] # [2, "masatoshi"]
(追記)
db.results_as_hash = true
を設定すると、db.execute
の結果をhashで取得できる。こっちの方が便利そう。
db.results_as_hash = true db.execute('select * from users') do |row| p row end #=> # {"id"=>1, "name"=>"hitoshi", 0=>1, 1=>"hitoshi"} # {"id"=>2, "name"=>"masatoshi", 0=>2, 1=>"masatoshi"}
参考:sqlite3-rubyを使ってSQLite3ファイルからの検索結果をHashとして読み込む
(追記終わり)
データ型
データ型は下記の5つしかない。
- TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
それ以外のデータ型を指定すると、上記のどれかに変換される。例えばVARCHAR(255)
を指定するとTEXT
になる。
これはVARCHAR(255)
にCHAR
が含まれるため。型に続く括弧は無視される。
If the declared type of the column contains any of the strings "CHAR", "CLOB", or "TEXT" then that column has TEXT affinity. Notice that the type VARCHAR contains the string "CHAR" and is thus assigned TEXT affinity.
すべての変換規則は上記ドキュメントを参照。
INTEGER PRIMARY KEY
データ型がINTEGER
のカラムにPRIMARY KEY
を指定した場合、AUTOINCREMENT
を指定したのと同じような挙動になる。
値を省略した場合に自動的に数値が格納される。
ただし、データ型にINT
を指定した場合にも上述の変換によってINTEGER
にはなるが、この挙動(AUTOINCREMENT
)にはならない。
明示的にAUTOINCREMENT
を指定したときとの違いは、AUTOINCREMENT
が過去に格納されていたレコードも含めて最大の整数値にインクリメントした値を格納するのに対して、AUTOINCREMENT
を明示しなかった場合には現時点での最大値を基に格納される値が決定されること。
つまり、レコードを削除した場合に、AUTOINCREMENT
を明示しなかった場合は、削除したレコードの値と同じ値が再度使用される可能性がある。
まとめ
お手軽に使えるけど、癖はちょいちょいあるのかもしれない。どのDBMSもそうだと思うけど。