如何在peewee(python)中保存单个事务中的所有实例?咿呀 python orm库)?比如说
from peewee import SqliteDatabase, Model, TextField
DB_NAME = 'users.db'
db = SqliteDatabase(os.path.join(os.path.dirname(__file__), DB_NAME))
class Users(Model):
user_id = IntegerField(index = True)
name = TextField(null = True, index = True)
password = TextField(null = True)
description = TextField(null = True)
class Meta:
database = db
if not Drugs.table_exists():
Drugs.create_table()
data_to_save = [('user1', 'pass1'), ('user2', 'pass2'), ('user3', 'pass3')]
for user_name, user_password in data_to_save:
user_data = Users.get_or_create(name=user_name, password=user_password)
user_data.save()
如何在一个事务中重写?
你可以用 "with "上下文管理器来包装你的查询。https:/docs.peewee-orm.comen3.4.0peeweetransactions.html。,所以。
with db.transaction():
for user_name, user_password in data_to_save:
user_data = Users.get_or_create(name=user_name, password=user_password)
user_data.save()
请注意: 我认为你应该小心使用db.transaction(),因为就我玩过的情况来看,它已经坏了。它默认不提供任何事务隔离。最好是直接使用数据库事务进行隔离。我很庆幸自己看到这些失败的次数太多,所以我经常写测试代码来检查这样的问题。而不是盲目的相信假的说法。这同时使用Python3.4和SQLite3。如果你想隔离工作,最好使用db.execute_sql('begin;'),因为它确实有效,并且创建了所需的锁,即使这些锁在这种情况下是延迟的,也就是乐观的并发控制。