首页 > 解决方案 > 是否可以将 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 文档中的示例

标签: pythonpostgresqlquestdb

解决方案


即使在 2021 年,Psycopg2 中也不支持准备好的语句。是的,您可以执行 PREPARE 并使用带参数的命名查询,但 Psycopg2 不支持与使用 Java JDBC 或 Rust Postgres 驱动程序相同的方式。

如果您开始使用 INSERT 语句编写循环,则每次迭代都会发送完整的语句文本,并且必须由数据库解析,因此大循环的 IO/CPU 开销将是可测量的。


推荐阅读