Perché $ dbh-> do ( 'VUOTO') non con DBD :: SQLite di Perl?
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');
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 });