为什么$dbh->;Perl(';VACUUM';)会失败吗';s DBD::SQLite?
我想在某个特定的时间在Perl下的SQLite数据库上执行为什么$dbh->;Perl(';VACUUM';)会失败吗';s DBD::SQLite?,sql,perl,sqlite,dbi,vacuum,Sql,Perl,Sqlite,Dbi,Vacuum,我想在某个特定的时间在Perl下的SQLite数据库上执行VACUUM,但它总是说 DBD::SQLite::db do失败:无法从事务中抽真空 那我该怎么做呢 my %attr = ( RaiseError => 0, PrintError => 1, AutoCommit => 0 ); my $dbh = DBI->connect('dbi:SQLite:dbname='.$file'','',\%attr) or die $DBI::errstr; 我
VACUUM
,但它总是说
DBD::SQLite::db do失败:无法从事务中抽真空
那我该怎么做呢
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');
默认情况下,DBI已启用自动提交。在连接过程中将其关闭:
my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });
我假设您在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
:您可以使用以下选项,以便为VACUUM
打开AutoCommit
,并在VACUUM
之后将AutoCommit
状态恢复到原来的状态。如果未设置RaiseError
,请将错误检查添加到taste
sub do_vacuum {
my ($dbh) = @_;
local $dbh->{AutoCommit} = 1;
$dbh->do('VACUUM');
return;
}
叫它:
do_vacuum($dbh);
我的%attr=(RaiseError=>0,PrintError=>1,AutoCommit=>0);my$dbh=DBI->connect('DBI:SQLite:dbname='.$file'','',\%attr)或die$DBI::errstr;我正在使用自动提交=>0。错误发生在:$dbh->do('deleteofromsoap;')$dbh->do('DELETE FROM result;')$胸径->提交$胸径->溶解氧(‘真空’);查斯。我想你把它倒过来了<代码>自动提交必须处于启用状态,才能在事务外部发生
$dbh->do('VACCUM')
。因此,真空需要自动提交=1才能禁用事务。谢谢。+1建议local$dbh->{AutoCommit}=1
并省去了$ac
变量。为什么我不知道可以在词法数组和哈希的元素上使用local
?Perl仍然有一些让我惊讶的地方:我总是忘记它,不得不检查一下