python - 在 python 中对 postgresql 执行多个查询的更快方法
问题描述
我正在用 python 编写一个脚本,我需要多次访问 postgresql 数据库并执行多个选择查询和插入查询。我正在尝试减少此脚本运行所需的时间。
目前我已经编写了一个辅助函数,它传递一个 qry 字符串、一个指示我是否正在插入或接收数据的布尔值以及一个参数列表,然后执行查询:
def sql_call(qry, insert, inputlist):
params = config_np()
with psycopg2.connect(**params) as conn:
cur = conn.cursor()
try:
cur.execute(qry, inputlist)
if insert:
conn.commit()
sqlrtn = True
else:
sqlrtn = cur.fetchall()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
quit()
conn.close()
return sqlrtn
我正在处理几十万个条目,这需要很长时间才能运行。有更快的方法吗?
解决方案
你可以做几件事。首先,不要与每个查询重新建立连接。这可以用于多个查询,因此您无需为每个查询重新创建它。如果您仍然希望具有执行查询的函数的灵活性,请创建一个类,其中该__init__
方法打开连接并将其保存在 self.conn 中,并创建一个__del__
关闭连接的方法。
对于 INSERT 操作,如果您使用VALUES
with,则可以插入多行,
INSERT INTO table (fld1, fld2, fld3)
(VALUES ('some', 'data', 'here'),
('more', 'data', 'here'));
psycopg2 在这样的查询中会占用很多行。对于SELECT
查询,这取决于您的程序在做什么。根据要求,鉴于这些天计算机上可用的数量,您可以在内存中缓存相当多的数据。
推荐阅读
- matlab - (Matlab) 关于迭代结果的考题
- r - 没有缺失值,但在 KNN R 期间将它们转换为 NA 值
- c# - VssResourceNotFoundException:API 资源位置
未在 {tfs url} 上注册 - c# - excel - VBA 导入和分割分隔的文本文件
- javascript - 为什么我的开发服务器处于无限重新加载循环中?
- if-statement - 如果拉过“错误”的单元格值
- json - 如何组合相关数据
- javascript - 反应 | Promise.then() 上的 Promise 未捕获类型错误
- node.js - 使用 NodeJS 发送基于 DynamoDb 流的 graphQL 突变
- php - 未定义变量:术语