Pourquoi dbh- $> faire ( 'VIDE') échoue avec DBD de Perl :: Le SQLite?
Question
Je veux faire VACUUM
à un certain temps sur une base de données SQLite en Perl, mais il dit toujours
DBD :: SQLite :: db n'échoué: ne peut pas vide à partir d'une transaction
Alors, comment puis-je faire?
my %attr = ( RaiseError => 0, PrintError => 1, AutoCommit => 0 );
my $dbh = DBI->connect('dbi:SQLite:dbname='.$file'','',\%attr)
or die $DBI::errstr;
J'utilise AutoCommit => 0
. Et l'erreur se produit alors:
$dbh->do('DELETE FROM soap');
$dbh->do('DELETE FROM result');
$dbh->commit;
$dbh->do('VACUUM');
La solution
Je suppose que vous avez AutoCommit => 0
dans l'appel de connexion parce que les travaux suivants:
#!/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;
Vous ne devez pas abandonner sur les transactions de pouvoir VACUUM
: Vous pouvez utiliser ce qui suit pour que AutoCommit
est activée pour VACUUM
et après la VACUUM
l'état AutoCommit
est revenu à ce qu'il était. Ajouter le contrôle d'erreur au goût si vous ne définissez pas RaiseError
.
sub do_vacuum {
my ($dbh) = @_;
local $dbh->{AutoCommit} = 1;
$dbh->do('VACUUM');
return;
}
Appelez-:
do_vacuum($dbh);
Autres conseils
Le DBI a autocommit activé par défaut. Éteignez-le lors de la connexion:
my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 });