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.
Quelle est l'exception? –
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