如何在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()
如何在单个交易中重写?
答案 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;'),因为它确实可以工作并创建所需的锁,即使在这种情况下延迟了,也就是说,乐观并发控制。