1

如何将所有实例保存在peewee(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()

如何在单个事务中重写?

4

2 回答 2

3

您可以使用“with”上下文管理器https://docs.peewee-orm.com/en/3.4.0/peewee/transactions.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()
于 2014-01-17T15:49:36.880 回答
1

被警告。我认为你应该小心 db.transaction() 因为就我一直在玩它而言,它已经坏了。默认情况下它不提供任何事务隔离。最好使用直接数据库事务进行隔离。我很高兴我多次看到这些失败,我一直在编写测试代码来检查这些问题。并且不要盲目相信虚假的说法。这在使用 Python 3.4 和 SQLite3 时。如果您希望隔离工作,最好使用 db.execute_sql('begin;') 因为它确实可以工作并创建所需的锁,即使这些在这种情况下被推迟,也就是乐观并发控制。

于 2014-05-20T14:40:40.657 回答