light log

学んだこととか

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.

Datatypes In SQLite Version 3

すべての変換規則は上記ドキュメントを参照。

INTEGER PRIMARY KEY

データ型がINTEGERのカラムにPRIMARY KEYを指定した場合、AUTOINCREMENTを指定したのと同じような挙動になる。

値を省略した場合に自動的に数値が格納される。

ただし、データ型にINTを指定した場合にも上述の変換によってINTEGERにはなるが、この挙動(AUTOINCREMENT)にはならない。

明示的にAUTOINCREMENTを指定したときとの違いは、AUTOINCREMENTが過去に格納されていたレコードも含めて最大の整数値にインクリメントした値を格納するのに対して、AUTOINCREMENTを明示しなかった場合には現時点での最大値を基に格納される値が決定されること。

つまり、レコードを削除した場合に、AUTOINCREMENTを明示しなかった場合は、削除したレコードの値と同じ値が再度使用される可能性がある。

まとめ

お手軽に使えるけど、癖はちょいちょいあるのかもしれない。どのDBMSもそうだと思うけど。

参考