批量插入表与外键字段

时间:2018-02-03 16:24:25

标签: python peewee

鉴于以下模型,

class Server(BaseModel):
    name = peewee.CharField(unique=True)

class Member(BaseModel):
    name = peewee.CharField(unique=True)
    server = peewee.ForeignKeyField(Server, related_name='members')

和一个字典,其中键为Server的名称和值为Member个名称的元组,

data = {
    'Server01': ('Laurence', 'Rose'),
    'Server02': ('Rose', 'Chris'),
    'Server03': ('Isaac',)
}

使用peewee批量插入Member的最快方法是什么?似乎应该在这里使用Model.insert_many(),但由于Member.server需要ServerServer.id,因此需要迭代data.items()并选择{{1}每个名字。

Server

毋庸置疑,这非常低效。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

好吧,如果您事先并不知道数据库中存在哪些服务器,那么您的问题似乎就是您正在使用的数据结构。保持server_name - >像这样的字典中的member_names并试图一次性插入它不是关系数据库的工作方式。

试试这个:

server_to_id = {}
for server_name in data:
    if server_name not in server_to_id:
        server = Server.create(name=server_name)
        server_to_id[server_name] = server.id

for server_name, member_names in data.items():
    server_id = server_to_id[server_name]
    member_data = [{'name': name, 'server': server_id} for name in member_names]
    Member.insert_many(member_data).execute()

注意:使用insert()或insert_many()时不要忘记调用.execute()。