sqlite3-rubyでSQLiteをいじる

sqlite-3-rubyのインストール

$ wget http://rubyforge.org/frs/download.php/17097/sqlite3-ruby-1.2.1.tar.gz
$ tar xzf sqlite3-ruby-1.2.1.tar.gz
$ cd sqlite3-ruby-1.2.1
$ ruby setup.rb config
$ ruby setup.rb setup
$ ruby setup.rb install

データベースへの接続

require 'sqlite3'
db = SQLite3::Database.new('test.db')

SQLiteではデータベース毎にファイルを一つ作成する。この場合、カレントディレクトリのtest.dbというファイルをデータベースとしてオープンする。またファイルがない場合は新しく作成される。

SQL文の実行

テーブルの作成
sql = <<SQL
create table test (
  title varchar(255),
  url varchar(255)
);
SQL
db.execute(sql)
レコードの追加、変更、削除
db.execute("insert into test values (&#39;yahoo&#39;, &#39;http://www.yahoo.co.jp&#39;)")
db.execute("update test set title=&#39;Yahoo&#39; where title=&#39;yahoo&#39;")
db.execute("delete from test where title=&#39;Yahoo&#39;")

レコードとは関連するデータの集まり。上の例だとtitleとurlという2つのフィールドが集まって1件のレコードになる。

複数のSQLの実行

sql = <<SQL
insert into test values (&#39;Yahoo&#39;, &#39;http://www.yahoo.co.jp&#39;);
insert into test values (&#39;Google&#39;, &#39;http://www.google.co.jp&#39;);
SQL
db.execute_batch(sql)

SELECT文の実行結果を取得

SELECT文の実行結果はブロックを使って受け取ることができる。

db.execute(&#39;select * from test&#39;) do |r|
  p r
end
["Yahoo", "http://www.yahoo.co.jp"]
["Google", "http://www.google.co.jp"]
最初の列だけを取得
p db.get_first_row(&#39;select * from test&#39;) #=> ["Yahoo", "http://www.yahoo.co.jp"]
最初の値だけを取得
p db.get_first_value(&#39;select * from test&#39;) #=> "Yahoo"

例外処理

SQLのエラーは例外として補足できる。

db.execute(&#39;create table hoge(id)&#39;)
begin
  db.execute(&#39;create table hoge(id)&#39;)
rescue SQLite3::SQLException => e
  puts e #=> table hoge already exists
end