Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用外键字段在表上大容量插入_Python_Peewee - Fatal编程技术网

Python 使用外键字段在表上大容量插入

Python 使用外键字段在表上大容量插入,python,peewee,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') 以及一个字典,其中键为服务器名称,值为成员名称的元组 data = { '

鉴于以下模型

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

class Member(BaseModel):
    name = peewee.CharField(unique=True)
    server = peewee.ForeignKeyField(Server, related_name='members')
以及一个字典,其中键为
服务器
名称,值为
成员
名称的元组

data = {
    'Server01': ('Laurence', 'Rose'),
    'Server02': ('Rose', 'Chris'),
    'Server03': ('Isaac',)
}
使用peewee批量插入
成员
s的最快方法是什么?似乎应该在这里使用,但因为
Member.server
需要
server
server.id
,这需要迭代
data.items()
并为每个名称选择
服务器

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)

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

好吧,如果您事先不知道数据库中有哪些服务器,那么您的问题似乎是您使用的数据结构。将服务器名->成员名保存在这样的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\ MUN()时,不要忘记调用.execute()