为什么$ dbh-> do('VACUUM')失败了Perl的DBD :: SQLite?

Gal*_*axy 4 sql sqlite perl dbi vacuum

我想VACUUM在Perl上的SQLite数据库上的某个时间做,但它总是说

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;
Run Code Online (Sandbox Code Playgroud)

我在用AutoCommit => 0.而错误发生在:

$dbh->do('DELETE FROM soap');
$dbh->do('DELETE FROM result');
$dbh->commit; 
$dbh->do('VACUUM');
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 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;
Run Code Online (Sandbox Code Playgroud)

你不必放弃交易能够VACUUM:您可以使用这样下AutoCommit被开启VACUUM和之后VACUUMAutoCommit状态恢复到不管它是什么.如果未设置,请添加错误检查RaiseError.

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

叫它:

do_vacuum($dbh);
Run Code Online (Sandbox Code Playgroud)

  • +1建议`local $ dbh - > {AutoCommit} = 1;`并省去`$ ac`变量. (3认同)