0

我正在比较 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 文档中的示例

4

3 回答 3

1

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

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

于 2021-05-18T20:21:28.560 回答
1

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

您可能想阅读手册中有关快速执行助手的部分。

于 2021-04-30T17:31:25.507 回答
1

为什么不?:


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 指出的那样,您可以在INSERTs此处结合使用助手Fast Execution

于 2021-04-30T21:42:21.120 回答