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