Top / Programming / Ruby / Ruby データベースライブラリ / SQLite/Ruby

SQLite/Ruby

軽量・高速なデータベースSQLiteをRubyから扱うためのライブラリ。

インストール

Windowsの場合

  1. RubyForgeから、 sqlite3-ruby(sqlite3-ruby-x.x.x.zip)をダウンロードする。

  2. ダウンロードしたファイルを展開する。

  3. インストールプログラムを実行する。

    ruby setup.rb config
    ruby setup.rb setup
    ruby setup.rb install
    

RubyGemsを使う場合

RubyGemsをインストールした後、 次のコマンドを実行する。

gem install sqlite3-ruby

SQLiteのインストール

  1. SQLite Download Pageから、 sqlitedll-3_x_x.zipをダウンロードする。

  2. ダウンロードしたファイルを展開する。

  3. sqlite.dllをパスの通ったディレクトリにコピーする。

使用方法

sqliteをロードする

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

更新履歴