繁体   English   中英

如何正确实现 Peewee 回滚?

[英]How to Properly Implement Peewee Rollback?

我有一个使用 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)

我希望我的 TestModel.update() 在 smtp.sendmail() 失败时回滚,但目前,代码不会回滚更新。

我也尝试使用下面的逻辑,但仍然无法回滚。

with sql_db.manual_commit():
    sql_db.begin()
    try:
        TestModel.update()
        smtp.sendmail()
    except Exception:
        sql_db.rollback()
    else:
        sql_db.commit()

我也试过sql_db.transaction() 作为 txn但仍然没有运气。

鉴于异常是由另一个函数引起的并且与 SQL 无关,我该如何实现回滚?

您可以在测试中看到,如果包装块中发生错误, atomic装饰器和上下文管理器将隐式回滚。

文档在这里:

http://docs.peewee-orm.com/en/latest/peewee/database.html#managing-transactions

这是一个最小的例子:

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]

RIP神户

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM