質問

私は、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ことができるように取引を放棄する必要はありません:あなたはとてもそのAutoCommitVACUUMのためにオンになり、VACUUMAutoCommit状態が戻って、それが何であれに戻され、次を使用することができます。あなたが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 });
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top