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
# ...
这几天在使用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
# ...