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

时间:2014-01-17 14:52:41

标签: python sqlite orm peewee

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

如何在单个交易中重写?

2 个答案:

答案 0 :(得分:3)

您可以使用“with”上下文管理器http://peewee.readthedocs.org/en/latest/peewee/cookbook.html#working-with-transactions来包装查询, 所以:

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 :(得分:1)

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