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');
Était-ce utile?

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 });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top