Python 如何正确实施Peewee回滚?
我有一个使用TestModel的代码,它继承了playhouse.postgres_ext.Model,PostgreSQL的一个实例为sql_db,SMTP的一个实例为SMTP,用于通知Python 如何正确实施Peewee回滚?,python,peewee,Python,Peewee,我有一个使用TestModel的代码,它继承了playhouse.postgres_ext.Model,PostgreSQL的一个实例为sql_db,SMTP的一个实例为SMTP,用于通知 @sql_db.atomic() def update_jersey(): TestModel.update(TestModel.jersey_number=24).where(TestModel.first_name="kobe").execute() smtp.sendmail(*args
@sql_db.atomic()
def update_jersey():
TestModel.update(TestModel.jersey_number=24).where(TestModel.first_name="kobe").execute()
smtp.sendmail(*args, **kwargs)
当smtp.sendmail()失败时,我希望我的TestModel.update()回滚,但当前代码没有回滚更新
我还尝试使用下面的逻辑,但回滚仍然不起作用
with sql_db.manual_commit():
sql_db.begin()
try:
TestModel.update()
smtp.sendmail()
except Exception:
sql_db.rollback()
else:
sql_db.commit()
我还尝试了作为txn的sql\u db.transaction(),但仍然没有成功
如果异常是由另一个函数引起的,并且与SQL无关,那么如何实现回滚呢?您可以在测试中看到,如果包装块中发生错误,
原子的
装饰器和上下文管理器将隐式回滚
此处的文档:
下面是一个简单的例子:
db = SqliteDatabase(':memory:')
class R(Model):
value = IntegerField()
class Meta:
database = db
db.create_tables([R])
with db.atomic():
R.create(value=1)
# Explicit rollback
with db.atomic() as txn:
R.create(value=2)
txn.rollback()
# Implicit rollback because of exception.
try:
with db.atomic():
R.create(value=3)
4 / 0
except ZeroDivisionError:
pass
print([x.value for x in R])
# Prints:
# [1]
撕裂科比