DBD::SQLiteのお勉強
Date: 2006年6月9日
DBD::SQLiteの勉強をしてますが、検索してもあまり日本語の情報は得られませんね。
というわけで覚え書き。
SQLiteはトランザクションを明示しとかないと、更新系のコマンドが実行される時は自動的にトランザクション宣言が行われるらしい。
つまり、100件のデータ追加では100回のBEGIN→COMMITが繰り返されるわけで、処理が非常に遅くなるというわけです。
PerlのDBD::SQLiteでこれを防ぐには下記のように書いとけば良いみたい。
my $mydb = ‘hoge.db’;
my $dbh = DBI->connect("dbi:SQLite:dbname=$mydb","","",{ AutoCommit => 0 });
$dbh->do(‘CREATE TABLE foo (a,b,c)’);
$dbh->do(‘BEGIN‘);
my $insert = $dbh->prepare("INSERT INTO foo VALUES(?,?,?)");
$insert->execute("1","2","3");
$dbh->do(‘COMMIT‘);
my $mydb = ‘hoge.db’;
my $dbh = DBI->connect(“dbi:SQLite:dbname=$mydb”,””,””,{ AutoCommit => 0 });
$dbh->do(‘CREATE TABLE foo (a,b,c)’);
my $insert = $dbh->prepare(“INSERT INTO foo VALUES(?,?,?)”);
$insert->execute(“1″,”2″,”3”);
$dbh->commit;
DBIで使う場合
$dbh->do(‘BEGIN’);
や
$dbh->do(‘COMMIT’);
とは書きません。
上記のようにします。
上記の例だとBEGINがないですが、
COMMITすれば勝手に次のトランザクションが始まります。
ちなみに戻すときは、
$dbh->rollback;
です。