我想在某个时间在 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/

10-11 05:07