Peewee交易似乎不起作用

时间:2016-11-06 14:07:37

标签: python peewee

这些天我使用python orm peewee时遇到了一个交易问题。我使用这个orm保存了两个book实例,并且在两个节省之间我引发了一个异常,所以我除了没有将它们保存到数据库中,但是它不起作用。谁有人解释为什么?我是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()

1 个答案:

答案 0 :(得分:1)

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

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

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

db = Book._meta.database
# ...