Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确实施Peewee回滚?_Python_Peewee - Fatal编程技术网

Python 如何正确实施Peewee回滚?

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

我有一个使用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, **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]
撕裂科比