是否可以将 psycopg2 用于准备好的语句?

Is it possible to use psycopg2 for prepared statements?

我正在比较 Postgres 客户端的某些功能的兼容性,但我很难让准备好的语句在 psychopg2 中工作。 Node.js pg 包允许我在提供名称 (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(, , , );",
        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 documentation

中的示例

据我所知,不支持“神奇地”准备语句。但是,您可以使用 execute().

执行 SQL PREPAREEXECUTE 语句

您可能想阅读手册中有关 fast execution helpers 的部分。

为什么不呢?:


date = dt.datetime.now().date()
insert_sql = """INSERT INTO trades
        VALUES (%s, %s, %s, %s)"""
# insert 10 records
for x in range(10):
    now = dt.datetime.utcnow()
    cursor.execute(insert_sql, (now, date, "python example", x))
# commit records
connection.commit()

结果是一样的。查询构建一次,然后使用 x 的不同参数多次 运行。正如@Ture Pålsson 指出的那样,您可以使用此处的助手 Fast Execution.

组合 INSERTs

即使在 2021 年,Psycopg2 也没有准备好的语句支持。是的,您可以执行 PREPARE 并使用带参数的命名查询,但是 Psycopg2 不提供支持,就像您可以通过 Java JDBC 或 Rust Postgres 驱动程序。

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