python - 是否可以将 psycopg2 用于准备好的语句?
问题描述
我正在比较 Postgres 客户端的一些功能的兼容性,并且我很难让准备好的语句在 Psychopg2 中工作。Node.jspg
包允许我在提供名称 ( insert-values
) 准备查询服务器端时执行以下操作:
for (let rows = 0; rows < 10; rows++) {
// Providing a 'name' field allows for prepared statements / bind variables
const query = {
name: "insert-values",
text: "INSERT INTO my_table VALUES($1, $2, $3, $4);",
values: [Date.now() * 1000, Date.now(), "node pg prep statement", rows],
}
const preparedStatement = await client.query(query)
}
在 Python 中,我正在使用psycopg2做这样的事情:
# insert 10 records
for x in range(10):
now = dt.datetime.utcnow()
date = dt.datetime.now().date()
cursor.execute("""
INSERT INTO trades
VALUES (%s, %s, %s, %s);
""", (now, date, "python example", x))
# commit records
connection.commit()
有没有办法在 Python 中创建准备好的语句?
编辑我正在使用QuestDB 文档中的示例
解决方案
即使在 2021 年,Psycopg2 中也不支持准备好的语句。是的,您可以执行 PREPARE 并使用带参数的命名查询,但 Psycopg2 不支持与使用 Java JDBC 或 Rust Postgres 驱动程序相同的方式。
如果您开始使用 INSERT 语句编写循环,则每次迭代都会发送完整的语句文本,并且必须由数据库解析,因此大循环的 IO/CPU 开销将是可测量的。
推荐阅读
- c - # 后面不跟宏参数
- javascript - 如何在不同时运行的情况下将相同的 Javascript 代码分配给多个 div
- python - groupby max 不删除列
- python - ImportError:无法从“TwitterAPI”导入名称“TwitterRestPager”(C:\Users\My name\Anaconda3\lib\site-packages\TwitterAPI\__init__.py)
- terraform - Terraform插值函数“加入”空值错误
- sql - 尝试输出演员角色时得到错误答案
- html - 为什么我在 Squarespace 中的动画可以在 Chrome 中运行,但在 Safari 中无法运行?
- c++ - 如何编写聚合模板别名的推演指南?
- kubernetes - 带有 HTTPS 后端的 VirtualService
- node.js - 如何在回调函数Node JS中打破for循环