2009-08-20 3 views
4

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 VACUUM dans une transaction

Alors, comment je fais ça? Je utilise AutoCommit => 0 J'utilise AutoCommit => 0. Et l'erreur se produit pendant:

$dbh->do('DELETE FROM soap'); 
$dbh->do('DELETE FROM result'); 
$dbh->commit; 
$dbh->do('VACUUM'); 
+1

 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 pendant:
 $dbh->do('DELETE FROM soap;'); $dbh->do('DELETE FROM result;'); $dbh->commit; $dbh->do('VACUUM'); 
Galaxy

Répondre

11

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 doivent pas renoncer à des transactions de pouvoir VACUUM: Vous pouvez utiliser ce qui suit pour que AutoCommit soit activé pour VACUUM et après l'VACUUM l'état AutoCommit est rétabli à ce qu'il était. Ajoutez une vérification 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-le:

do_vacuum($dbh); 
+0

Ainsi, VACUUM a besoin d'AutoCommit = 1 pour désactiver la transaction. Merci. – Galaxy

+3

+1 Suggérer 'local $ dbh -> {AutoCommit} = 1;' et se passer de la variable '$ ac'. – pilcrow

+1

Pourquoi je ne savais pas que vous pouviez utiliser 'local' sur des éléments de tableaux et de hachages * lexical *? Perl a encore quelques surprises pour moi. : D –

1

DBI a activé la validation automatique par défaut. Éteignez-le lors de la connexion:

my $dbh = DBI->connect($dsn, $user, $pass, { AutoCommit => 0 }); 
+1

Chas. Je pense que vous l'avez inversé. 'AutoCommit' doit être activé pour' $ dbh-> do ('VACCUM') 'se produire en dehors d'une transaction. –

Questions connexes