Python 是否可以将psychopg2用于准备好的陈述?
我正在比较Postgres客户端的一些特性以确保兼容性,我很难准备好在psychopg2中使用的语句。Node.jsPython 是否可以将psychopg2用于准备好的陈述?,python,postgresql,questdb,Python,Postgresql,Questdb,我正在比较Postgres客户端的一些特性以确保兼容性,我很难准备好在psychopg2中使用的语句。Node.jspg包允许我在提供名称(insert values)准备查询服务器端时执行以下操作: for(让行=0;行
pg
包允许我在提供名称(insert values
)准备查询服务器端时执行以下操作:
for(让行=0;行<10;行++){
//提供“名称”字段允许准备语句/绑定变量
常量查询={
名称:“插入值”,
文本:“在我的表格中插入值($1,$2,$3,$4);”,
值:[Date.now()*1000,Date.now(),“node pg prep statement”,行],
}
const preparedStatement=wait client.query(查询)
}
在Python中,我使用以下命令执行类似的操作:
#插入10条记录
对于范围(10)内的x:
now=dt.datetime.utcnow()
date=dt.datetime.now().date()
cursor.execute(“”)
插入交易
值(%s,%s,%s,%s);
“”,(现在,日期,“python示例”,x))
#提交记录
commit()连接
有没有办法用Python创建准备好的语句
编辑我使用的样本来自据我所知,不支持“神奇地”准备语句。但是,您可以使用
execute()
执行SQLPREPARE
和execute
语句
您可能想阅读手册中的章节。据我所知,不支持“神奇地”准备语句。但是,您可以使用
execute()
执行SQLPREPARE
和execute
语句
您可能想阅读手册中的章节。为什么不呢
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所指出的,您可以使用此处的帮助程序组合插入的。为什么不呢
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所指出的,您可以使用此处的帮助程序组合插入内容。即使在2021年,Psycopg2中也没有现成的语句支持。是的,您可以准备并使用带参数的命名查询,但Psycopg2不支持这种方法,正如您可以在Java JDBC或Rust Postgres驱动程序中找到它一样
如果您开始使用INSERT语句编写循环,则每次迭代都会发送完整的语句文本,并且必须由DB进行解析,因此对于大循环来说,IO/CPU开销将是可测量的。即使在2021年,Psycopg2中也没有准备好的语句支持。是的,您可以准备并使用带参数的命名查询,但Psycopg2不支持这种方法,正如您可以在Java JDBC或Rust Postgres驱动程序中找到它一样
如果开始使用INSERT语句编写循环,则每次迭代都会发送完整的语句文本,并且必须由DB进行解析,因此对于大循环来说,IO/CPU开销将是可测量的。是的,这是一个好主意,但for循环中的时间戳不会更新。看起来我仍然缺少要在服务器端编译的语句,这在节点的pg
库中可以使用“name”属性。将时间戳移动到循环中。正如@TurePålsson建议的,您可以直接使用cur.EXECUTE()
使用PREPARE/EXECUTE
。是的,这是一个好主意,但是for循环中不会更新时间戳。看起来我仍然缺少要在服务器端编译的语句,这在节点的pg
库中可以使用“name”属性。将时间戳移动到循环中。正如@TurePålsson所建议的,您可以直接使用PREPARE/EXECUTE
和cur.EXECUTE()
。感谢您的提示,我将尝试cursor.EXECUTE()
执行值()
谢谢您的提示,我将尝试cursor.EXECUTE\u values()