4

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

2 に答える 2

11

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オンになります。を設定しない場合は、エラーチェックを追加して味わってください。VACUUMVACUUMAutoCommitRaiseError

sub do_vacuum {
    my ($dbh) = @_;
    local $dbh->{AutoCommit} = 1;
    $dbh->do('VACUUM');
    return;
}

あれを呼べ:

do_vacuum($dbh);
于 2009-08-20T01:42:50.983 に答える
1

DBIではデフォルトで自動コミットがオンになっています。接続中はオフにしてください。

my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });
于 2009-08-20T01:38:29.053 に答える