我想在某个时间在 Perl 下的 SQLite 数据库上执行 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');
最佳答案
我假设您在 connect 调用中有 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);
关于sql - 为什么 $dbh->do ('VACUUM' ) 会因 Perl 的 DBD::SQLite 而失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1303514/