[英]Psycopg2 query remove \n from args
我正在使用python3和postgres 11.5。
这是脚本:
a = cursor.execute("SELECT tablename FROM pg_catalog.pg_tables limit 5")
for table in a:
cursor.execute("SELECT * FROM pg_prewarm(public.%s)", [table[0]])
查询获得一些表名,循环查询应将表名作为%s运行。 但是由于某种原因,我在查询中使用// // n获得了arg table[0]
,并将其弄乱了。
如果我打印结果,我得到表名作为元组:
[('sa1591354519',), ('sa1591397719',), ('sa1591397719',)]
因此[table[0]]
是一个字符串。
我得到的错误:
1574683839 [16177], ERR, execute ({'Error while connecting to PostgreSQL': SyntaxError('syntax error at or near "\'sa1591440919\'"\nLINE 1: SELECT * FROM pg_prewarm(public.\'sa1591440919\')\n ^\n')},)
我能做什么 ?
错误与您看到的换行无关,换行只是错误消息的产物。 如果要打印出错误,将看到:
syntax error at or near "'sa1591440919'"
LINE 1: SELECT * FROM pg_prewarm(public.'sa1591440919')
^
换句话说,Postgres不喜欢您传递的表名,因为它包含引号。 之所以发生这种情况,是因为您试图将表名视为普通的查询参数,这会使psycopg对其进行引用...但是在这种情况下,这不是您想要的。
只需将查询模板的用法替换为普通的Python字符串替换即可:
a = cursor.execute("SELECT tablename FROM pg_catalog.pg_tables limit 5")
for table in a:
cursor.execute("SELECT * FROM pg_prewarm(public.%s)" % (table[0]))
但这实际上不起作用,因为cursor.execute
不会返回值,所以a
将为None
。 您将需要执行以下操作:
cursor.execute("SELECT tablename FROM pg_catalog.pg_tables limit 5")
a = cursor.fetchall()
for table in a:
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.