Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么$dbh->;Perl(';VACUUM';)会失败吗';s DBD::SQLite?_Sql_Perl_Sqlite_Dbi_Vacuum - Fatal编程技术网

为什么$dbh->;Perl(';VACUUM';)会失败吗';s DBD::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; 我

我想在某个特定的时间在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;
我正在使用
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仍然有一些让我惊讶的地方:我总是忘记它,不得不检查一下