日々雑感 2008/05/05

1. SQLiteで遊んでいる。

コマンドラインからでも気軽に試せるし、rubyで少しスクリプトを書いてもよい。
2万件近くレコードがあるのに、一瞬にして結果を表示してくれるのがおもしろくて仕方がない。

図書カードが確か2,500円分あったので、今日はSQLの本を一冊購入してこようと思う。

csvファイルから読み込むには、コマンドラインから

sqlite3 -separator , test.db ".import test.csv test"

なんて書いてもよいのだけれども、自分のつたない知識では主キーを設定できなかったので、rubyで一項目ずつ加えていくことにした。

ただし、そのまま一項目ずつ加えると劇的に遅いので、トランザクションを使う。

db.transaction
begin
  db.execute "insert test (hoge, piyo) values(?, ?)", hoge, piyo
  db.commit
rescue
  db.rollback
end

こんな風に使うらしい。

トランザクションを明示的にしない場合には、裏で一項目追加されるごとにトランザクションをおこない(この書き方があっているかどうかは知らない)、commitされるそうだ。
それで、遅くなる理由が納得できた。

事実、トランザクションを使うと何倍も早く追加ができた。