Я хочу сделать VACUUM
в определенное время в базе данных SQLite под Perl, но он всегда говорит
DBD :: SQLite :: db do не удалось: не удалось выполнить 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');
2 ответа
Я предполагаю, что у вас есть 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);
local $dbh->{AutoCommit} = 1;
и отказаться от переменной $ac
.
local
для элементов лексических массивов и хешей? Perl по-прежнему преподносит мне несколько сюрпризов. : D
perldoc perlsub
: perldoc.perl.org/perlsub.html#Temporary-Values-via-local%28%29
В DBI по умолчанию включена автоматическая фиксация. Выключите его во время подключения:
my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });
AutoCommit
должен быть включен, чтобы $dbh->do('VACCUM')
происходило вне транзакции.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.