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

  

DBD :: SQLite的::分贝不失败:不能从事务内的真空

那么,如何做到这一点?

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被开启VACUUMVACUUMAutoCommit状态恢复到不管它是什么。添加错误检查,如果您没有设置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