是否可以将 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 PREPARE
和 EXECUTE
语句
您可能想阅读手册中有关 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 大循环的开销。
我正在比较 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()
.
PREPARE
和 EXECUTE
语句
您可能想阅读手册中有关 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 大循环的开销。