gpt4 book ai didi

python - 在具有外键字段的表上批量插入

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:54 25 4
gpt4 key购买 nike

给定以下模型,

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() 并为每个名称选择一个 Server

for server_name, member_names in data.items():
server = Server.select().where(Server.name == server_name)
member_data = []
for name in member_names:
member_data.append({'name': name, 'server': server})

with db.atomic():
Member.insert_many(member_data)

不用说,这是非常低效的。有更好的方法吗?

最佳答案

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

试试这个:

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()。

关于python - 在具有外键字段的表上批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48599465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com