Psycopg2查询从参数中删除\ n

时间:2019-11-25 12:15:14

标签: python python-3.x postgresql

我使用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')},)

我该怎么办?

1 个答案:

答案 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:
  ...