なぜ$ dbh->( 'VACUUM')PerlのDBD :: SQLiteので失敗するのですか?
質問
私は、Perlの下でSQLiteデータベース上の特定の時間にVACUUM
をしたいが、それは常に
DBD :: SQLiteのDB ::失敗したん:トランザクション内からできないVACUUM
それでは、どのように私はこれを行うのですか?
my %attr = ( RaiseError => 0, PrintError => 1, AutoCommit => 0 );
my $dbh = DBI->connect('dbi:SQLite:dbname='.$file'','',\%attr)
or die $DBI::errstr;
私はAutoCommit => 0
を使用しています。そして、エラーが発生しばらくます:
$dbh->do('DELETE FROM soap');
$dbh->do('DELETE FROM result');
$dbh->commit;
$dbh->do('VACUUM');
解決
私はあなたが以下の動作するため、接続コールにAutoCommit => 0
ていると仮定しています:
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect('dbi:SQLite:test.db', undef, undef,
{ RaiseError => 1, AutoCommit => 1}
);
$dbh->do('VACUUM');
$dbh->disconnect;
あなたはVACUUM
ことができるように取引を放棄する必要はありません:あなたはとてもそのAutoCommit
がVACUUM
のためにオンになり、VACUUM
後AutoCommit
状態が戻って、それが何であれに戻され、次を使用することができます。あなたがRaiseError
を設定しない場合は味にエラーチェックを追加します。
sub do_vacuum {
my ($dbh) = @_;
local $dbh->{AutoCommit} = 1;
$dbh->do('VACUUM');
return;
}
それを呼び出します:
do_vacuum($dbh);
他のヒント
DBIは、自動コミットはデフォルトでオンになっています。接続時に、それをオフにします:
my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });
所属していません StackOverflow