Domanda

Voglio fare VACUUM in un certo tempo su un database SQLite in Perl, ma si dice sempre

  

DBD :: SQLite :: db fanno fallito: non può vuoto dalla all'interno di una transazione

Quindi, come faccio a fare questo?

my %attr = ( RaiseError => 0, PrintError => 1, AutoCommit => 0 );
my $dbh = DBI->connect('dbi:SQLite:dbname='.$file'','',\%attr) 
    or die $DBI::errstr;

Sto usando AutoCommit => 0. E l'errore si verifica durante:

$dbh->do('DELETE FROM soap');
$dbh->do('DELETE FROM result');
$dbh->commit; 
$dbh->do('VACUUM');
È stato utile?

Soluzione

Io parto dal presupposto che avete AutoCommit => 0 nella chiamata di connessione perché i seguenti lavori:

#!/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;

Non è necessario rinunciare a transazioni per poter VACUUM: È possibile utilizzare il seguente in modo che AutoCommit è attivata per VACUUM e dopo la VACUUM stato AutoCommit è ritornato di nuovo a qualunque cosa fosse. Aggiungi controllo degli errori di assaggiare, se non si imposta RaiseError.

sub do_vacuum {
    my ($dbh) = @_;
    local $dbh->{AutoCommit} = 1;
    $dbh->do('VACUUM');
    return;
}

Lo chiamano:

do_vacuum($dbh);

Altri suggerimenti

La DBI ha autocommit attivata per impostazione predefinita. Spegnerlo durante la connessione:

my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top