繁体   English   中英

Psycopg2查询从参数中删除\\ n

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM