【问题标题】:psycopg2 - Inserting list of dictionaries into PosgreSQL database. Too many executions?psycopg2 - 将字典列表插入 PostgreSQL 数据库。处决太多?
【发布时间】:2019-03-01 14:32:18
【问题描述】:

我正在向 PostgreSQL 数据库中插入一个字典列表。该列表将快速增长,dict 值(列)的数量在 30 左右。简化数据:

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

使用以下代码将数据插入 PostgreSQL 数据库确实有效(如answer),但我担心执行太多查询。

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

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

【问题讨论】:

标签: python postgresql psycopg2


【解决方案1】:

使用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 sequence of seqeences
values = [[value for value in project.values()] for project in projects]

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

【讨论】:

  • 酷。仅用几行就获得了 30% 的性能提升。谢谢! :)
【解决方案2】:

【讨论】:

    【解决方案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

    【讨论】:

    • 应该是values = [{'name': ...
    • 感谢您的关注,答案已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多