Warum schlägt $dbh->do('VACUUM') mit Perls DBD::SQLite fehl?
Frage
Ich will das tun VACUUM
zu einem bestimmten Zeitpunkt in einer SQLite-Datenbank unter Perl, aber es heißt immer
DBD::SQLite::db ist fehlgeschlagen:kann innerhalb einer Transaktion kein VACUUM durchführen
Wie mache ich das?
my %attr = ( RaiseError => 0, PrintError => 1, AutoCommit => 0 );
my $dbh = DBI->connect('dbi:SQLite:dbname='.$file'','',\%attr)
or die $DBI::errstr;
ich benutze AutoCommit => 0
.Und der Fehler tritt auf, während:
$dbh->do('DELETE FROM soap');
$dbh->do('DELETE FROM result');
$dbh->commit;
$dbh->do('VACUUM');
Lösung
Ich gehe davon aus, dass Sie das getan haben AutoCommit => 0
im Connect-Aufruf, weil Folgendes funktioniert:
#!/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;
Sie müssen dafür nicht auf Transaktionen verzichten VACUUM
:Dazu können Sie Folgendes verwenden AutoCommit
ist eingeschaltet für VACUUM
und nach dem VACUUM
Die AutoCommit
Der Zustand wird auf den ursprünglichen Zustand zurückgesetzt.Fügen Sie nach Belieben eine Fehlerprüfung hinzu, wenn Sie dies nicht festlegen RaiseError
.
sub do_vacuum {
my ($dbh) = @_;
local $dbh->{AutoCommit} = 1;
$dbh->do('VACUUM');
return;
}
Nennen:
do_vacuum($dbh);
Andere Tipps
Die DBI hat autocommit standardmäßig aktiviert. Ich schalte es aus bei der Verbindung:
my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });