2010-02-02 2 views
1
def rollback_savepoint(self): 
    try: 
     self.db.execute("rollback to savepoint pt;") 
    except: 
     print "roll back to save point failed" 
    else: 
     print "Roll back to save point. Done" 

Dans l'extrait de code ci-dessus, il est indiqué «Échec de l'annulation du point de sauvegarde». Qu'est-ce qui n'a pas fonctionné?python sqlite 3: retour en arrière pour enregistrer le point échoue

EDIT: Je changé le code comme indiqué ci-dessous et de recevoir des messages d'erreur

self.db.execute("savepoint pt;") 
print "Save point created" 

self.cursor.execute("insert into STK values(33)") 
self.db.execute("rollback to savepoint pt;") 

erreur

Save point created 
Traceback (most recent call last): 
    File "open_db.py", line 77, in <module> 
    obj1.save_point() 
    File "open_db.py", line 63, in save_point 
    self.db.execute("rollback to savepoint pt;") 
sqlite3.OperationalError: no such savepoint: pt 
+0

Quelle est l'exception? –

+0

ne saisissez jamais d'exceptions que vous ne gérez pas. Laissez-le augmenter, de sorte que vous puissiez avoir des messages d'erreur et des retraçages utiles. – nosklo

+0

obj1.rollback_savepoint() Fichier "open_db.py", ligne 65, dans rollback_savepoint self.db.execute ("rollback à SAVEPOINT pt;") sqlite3.OperationalError: pas de point de sauvegarde: pt –

Répondre

4

Ne jamais intervenir sur les exceptions que vous n'êtes pas la manipulation. Laissez-le augmenter, de sorte que vous puissiez avoir des messages d'erreur et des retraçages utiles.

Exemple:

>>> c.execute('rollback to savepoint pt;') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: no such savepoint: pt 

Du retraçage je peux connaître l'erreur est qu'il n'y a pas pt savepoint. Je ne peux pas savoir ce qui ne va pas chez vous parce que vous cachez les informations qui peuvent vous aider le plus. Attraper toutes les erreurs et imprimer un message "Échec" est stupide - le retraçage est beaucoup plus utile et explique mieux le problème.


EDIT: Votre code n'a pas été exactement un testcase facile à exécuter, mais en le lisant, je suis capable d'écrire un peu moi-même code pour reproduire le problème. Je ne peux pas expliquer exactement ce qui se passe encore, mais j'ai trouvé un moyen de le faire fonctionner - lié à how sqlite3 module deals with transactions.

Voici mon plein, par exemple runnable:

import sqlite3 
from tempfile import NamedTemporaryFile as NF 
import os 

f = NF(suffix='.db', delete=False).name 

db = sqlite3.connect(f) 

try: 
    db.execute('CREATE TABLE foo (id INTEGER PRIMARY KEY, data VARCHAR)') 
    db.isolation_level = None 

    db.execute('INSERT INTO foo (data) values (?)', ('hello',)) 
    db.execute('INSERT INTO foo (data) values (?)', ('world',)) 

    db.execute("savepoint pt;") 
    db.execute('INSERT INTO foo (data) values (?)', ('bah',)) 
    db.execute('INSERT INTO foo (data) values (?)', ('goodbye world',)) 
    db.execute("rollback to savepoint pt;") 

    db.execute('INSERT INTO foo (data) values (?)', ('peace',)) 

    assert list(db.execute('select * from foo')) == [(1, 'hello'), 
                (2, 'world'), 
                (3, 'peace')] 
finally: 
    db.close() 
    os.remove(f) 

La ligne qui rend le travail est db.isolation_level = None. Si vous le commentez, il se brise comme votre erreur. J'ai essayé d'utiliser toutes les valeurs documentées "DEFERRED", "IMMEDIATE" et "EXCLUSIVE", toutes se sont terminées par erreur.

+0

Merci, Après avoir retiré la gestion des exceptions, je suis arrivé ce sqlite3.OperationalError: pas de point de sauvegarde: pt Comment imprimer Erreur lors de l'utilisation du gestionnaire d'exceptions? quelque chose comme perror() pour python est disponible ?? –

+0

Oui, il y a - mais pourquoi? L'erreur est déjà imprimée automatiquement, l'attraper juste pour imprimer est le code de duplication – nosklo

+0

okay.Avez-vous vu ci-dessus message d'erreur quel est le problème ici? enregistrer les points fonctionne bien et revenir en arrière produit un message d'erreur. –