« 胃炎? | メイン | 日本、逆転負け【FIFAワールドカップ'06:オーストラリア戦】 »

DBD::SQLiteのお勉強 [Perl,覚え書き]

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');

トラックバック

このエントリーのトラックバックURL:
http://yohsuke.net/mt/mt-tb.cgi/260

コメント

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;
です。

コメントを投稿