这些天我使用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()
答案 0 :(得分:1)
问题是当你调用“get_db()”时,你正在实例化新的数据库对象。数据库是有状态的,因为它们管理给定线程的活动连接。所以你基本上得到的是两个不同的数据库,一个与你的模型相关联,一个有你的连接和事务。当您致电db.transaction()
正在进行交易时,而不是您认为的连接。
将代码更改为如下所示,它将按预期工作。
book1 = Book(name='book1')
book2 = Book(name='book2')
db = Book._meta.database
# ...