Я предполагаю, что у вас есть 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);