【发布时间】:2016-05-18 11:06:43
【问题描述】:
peewee 允许通过insert_many() 和insert_from() 进行批量插入,但是insert_many() 允许插入数据列表,但不允许从数据库的其他部分计算数据。 insert_from() 允许从数据库的其他部分计算数据,但不允许从 python 发送任何数据。
示例:
假设模型结构如下:
class BaseModel(Model):
class Meta:
database = db
class Person(BaseModel):
name = CharField(max_length=100, unique=True)
class StatusUpdate(BaseModel):
person = ForeignKeyField(Person, related_name='statuses')
status = TextField()
timestamp = DateTimeField(constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')], index=True)
还有一些初始数据:
Person.insert_many(rows=[{'name': 'Frank'}, {'name': 'Joe'}, {'name': 'Arnold'}]).execute()
print ('Person.select().count():',Person.select().count())
输出:
Person.select().count(): 3
假设我们想添加一堆新的状态更新,就像这个列表中的那些:
new_status_updates = [ ('Frank', 'wat')
, ('Frank', 'nooo')
, ('Joe', 'noooo')
, ('Arnold', 'nooooo')]
我们可能会尝试像这样使用insert_many():
StatusUpdate.insert_many( rows=[{'person': 'Frank', 'status': 'wat'}
, {'person': 'Frank', 'status': 'nooo'}
, {'person': 'Joe', 'status': 'noooo'}
, {'person': 'Arnold', 'status': 'nooooo'}]).execute()
但这会失败:person 字段需要 Person 模型或 Person.id,我们必须进行额外查询才能从名称中检索它们。
我们可以通过insert_from() 来避免这种情况,允许我们进行子查询,但insert_from() 无法处理我们的列表或字典。怎么办?
【问题讨论】:
标签: python sql orm bulkinsert peewee