如何在peewee(python)中单次事务中保存所有实例?

问题描述 投票:1回答:2

如何在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()

如何在一个事务中重写?

python sqlite orm peewee
2个回答
3
投票

你可以用 "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()

1
投票

请注意: 我认为你应该小心使用db.transaction(),因为就我玩过的情况来看,它已经坏了。它默认不提供任何事务隔离。最好是直接使用数据库事务进行隔离。我很庆幸自己看到这些失败的次数太多,所以我经常写测试代码来检查这样的问题。而不是盲目的相信假的说法。这同时使用Python3.4和SQLite3。如果你想隔离工作,最好使用db.execute_sql('begin;'),因为它确实有效,并且创建了所需的锁,即使这些锁在这种情况下是延迟的,也就是乐观的并发控制。

© www.soinside.com 2019 - 2024. All rights reserved.