我使用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')},)
我该怎么办?
答案 0 :(得分:0)
错误与您看到的换行无关,换行只是错误消息的产物。如果要打印错误,则会看到:
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:
...