psycopg2 - 将字典列表插入PosgreSQL数据库。执行次数太多?

13

我正在将字典列表插入到PostgreSQL数据库中。该列表将快速增长,字典值(列)的数量约为30个。简化后的数据:

projects = [
{'name': 'project alpha', 'code': 12, 'active': True},
{'name': 'project beta', 'code': 25, 'active': True},
{'name': 'project charlie', 'code': 46, 'active': False}
]

使用以下代码将数据插入到PostgreSQL数据库是可行的(就像这个答案中所示),但我担心执行过多的查询。

for project in projects:
    columns = project.keys()
    values = project.values()

    query = """INSERT INTO projects (%s) VALUES %s;"""

    # print(cursor.mogrify(query, (AsIs(','.join(project.keys())), tuple(project.values()))))

    cursor.execute(query, (AsIs(','.join(columns)), tuple(values)))

conn.commit()

有更好的做法吗?非常感谢您的帮助!


1
你可以使用复制语句。https://dev59.com/dnE95IYBdhLWcg3wi-Uc - Nurullah Macun
3个回答

17

使用execute_values()在单个查询中插入多行。

import psycopg2
from psycopg2.extras import execute_values

# ...

projects = [
{'name': 'project alpha', 'code': 12, 'active': True},
{'name': 'project beta', 'code': 25, 'active': True},
{'name': 'project charlie', 'code': 46, 'active': False}
]

columns = projects[0].keys()
query = "INSERT INTO projects ({}) VALUES %s".format(','.join(columns))

# convert projects values to list of lists
values = [[value for value in project.values()] for project in projects]

execute_values(cursor, query, values)
conn.commit()

很棒。只用了几行代码就获得了30%的性能提升。谢谢! :) - PythonSherpa

3

另一种不需要对字典列表进行过多数据操作的高性能选项是 execute_batch (在 psycopg2 版本 2.7 中新引入)。

例如:

import psycopg2
from psycopg2.extras import execute_batch

values = [{'name': 'project alpha', 'code': 12, 'active': True}, ...]
query = "INSERT INTO projects VALUES (%(name)s, %(code)s, %(active)s)"

execute_batch(cursor, query, values)
conn.commit()

https://www.psycopg.org/docs/extras.html#psycopg2.extras.execute_batch


1
应该是 values = [{'name': ... - Seb

2
你可以使用批量加载来加速处理。 这里介绍了如何在PostgreSQL中使用COPY命令进行更快的批量加载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接