[英]Why does $dbh->do('VACUUM') fail with Perl's DBD::SQLite?
我想在特定时间在Perl下的SQLite数据库上执行VACUUM
,但它总是说
DBD :: SQLite :: db执行失败:无法从事务内进行抽真空
那么我该怎么做呢?
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
则添加错误检查以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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.