軽量・高速なデータベースSQLiteをRubyから扱うためのライブラリ。
RubyForgeから、 sqlite3-ruby(sqlite3-ruby-x.x.x.zip)をダウンロードする。
ダウンロードしたファイルを展開する。
インストールプログラムを実行する。
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install
RubyGemsをインストールした後、 次のコマンドを実行する。
gem install sqlite3-ruby
SQLite Download Pageから、 sqlitedll-3_x_x.zipをダウンロードする。
ダウンロードしたファイルを展開する。
sqlite.dllをパスの通ったディレクトリにコピーする。
require 'sqlite3'
db = SQLite3::Database.new("data.db")
db.close
String型の「氏名」フィールド、 Integer型の「年齢」フィールド、 String型の「部署」フィールド、 を持つ「社員」テーブルを作成する。
sql = <<SQL
create table 社員 (
名前 varchar(10),
年齢 integer,
部署 varchar(200)
);
SQL
db.execute(sql)
使用できるデータ型
レコードを登録する
sql = "insert into 社員 values ('橋本', 26, '広報部')"
db.execute(sql)
プレースホルダとバインド値を使用した場合
sql = "insert into 社員 values (?, ?, ?)"
db.execute(sql, '小泉', 35, '営業部')
db.execute(sql, '亀井', 40, '営業部')
名前付きプレースホルダも使用可能
sql = "insert into 社員 values (:name, :age, :post)"
db.execute(sql, :name => '小泉', :age => 35, :post => '営業部')
db.execute(sql, :name => '亀井', :age => 40, :post => '営業部')
レコードを取得する
db.execute('select * from 社員') do |row|
#rowは結果の配列
puts row.join("\t")
end
結果
橋本 26 広報部
小泉 35 営業部
亀井 40 営業部
プレースホルダとバインド値を使用した場合
db.execute('select * from 社員 where 年齢=?', 40) do |row|
#rowは結果の配列
puts row.join("\t")
end
結果
亀井 40 営業部
列名とレコードを取得する
db.execute2('select * from 社員') do |row|
#rowは結果の配列。ただし最初のレコードは列名。
puts row.join("\t")
end
結果
名前 年齢 部署
橋本 26 広報部
小泉 35 営業部
亀井 40 営業部
列名とレコードを別々に取得したい場合
# columnsに列名、rowsにレコードが入る
columns, *rows = db.execute2('select * from 社員')
ResultSetを取得する
result = db.query('select * from 社員')
result.each do |row|
puts row.join("\t")
end
結果
橋本 26 広報部
小泉 35 営業部
亀井 40 営業部
最初のレコードを取得する
result = db.get_first_row('select * from 社員')
puts result.join("\t")
結果
橋本 26 広報部
最初のレコードの最初の値を取得する
count = db.get_first_value('select count(*) from 社員')
puts count
結果
3
#小泉の部署を広報部に更新する
db.execute("update 社員 set 部署='広報部' where 名前='小泉'")
# 亀井を削除
db.execute("delete from 社員 where 名前='亀井'")
ブロックを与えた場合、終了した時点でコミットする。
db.transaction do
sql = "insert into 社員 values (?, ?, ?)"
db.execute(sql, '橋本', 26, '広報部')
db.execute(sql, '小泉', 35, '営業部')
db.execute(sql, '亀井', 40, '営業部')
end
ブロックを与えない場合、明示的にコミットまたはロールバックを行う。
db.transaction
begin
db.execute('delete from 社員')
db.commit
rescue
db.rollback
end