为什么$ dbh->做( '真空')失败,Perl的DBD :: SQLite的?
题
我想在某个时间的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
被开启VACUUM
和VACUUM
后AutoCommit
状态恢复到不管它是什么。添加错误检查,如果您没有设置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 });
不隶属于 StackOverflow