Peewee 交易似乎不起作用

Peewee transaction seems not work

这几天在使用python orm peewee的时候遇到了一个交易问题。我使用这个 orm 保存了两个书籍实例,并且在两次保存之间我提出了一个例外,所以我除了其中 none 被保存到数据库之外,但它不起作用。谁能解释为什么?我是 python 的新手,谢谢。

代码如下:

from peewee import *

def get_db():
    return SqliteDatabase("test.db")

class Book(Model):
    id = PrimaryKeyField()
    name = CharField()
    class Meta:
        database = get_db()

def test_transaction():
    book1 = Book(name="book1")
    book2 = Book(name="book2")

    db = get_db()
    db.create_tables([Book], safe=True)

    try:
        with db.transaction() as tran:
            book1.save()
            raise ProgrammingError("test")
            book2.save()
    except:
        pass

    for book in Book.select():
        print(book.name)


if __name__ == '__main__':
    test_transaction()

问题是当您调用 "get_db()" 时,您正在实例化新的数据库对象。数据库是有状态的,因为它们管理给定线程的活动连接。所以你基本上得到的是两个不同的数据库,一个与你的模型相关联,另一个有你的连接和事务。当您调用 db.transaction() 时,交易正在进行,但不是在您认为的连接上。

将代码更改为如下所示,它将按您预期的方式工作。

book1 = Book(name='book1')
book2 = Book(name='book2')

db = Book._meta.database
# ...