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');
War es hilfreich?

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 });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top