似乎将表名作为psycopg2中的参数传递不适用于外部公共表。代码和结果如下。感谢任何帮助。
此代码效果很好。
cursor.execute('select * from public.wc_test limit 1')
但是,此代码返回错误
cursor.execute(sql.SQL('select * from {} limit 1').format(sql.Identifier('public.wc_test')))
ProgrammingError Traceback(最近一次调用最后一次) in() ----> 1 cursor.execute(sql.SQL('select * from {} limit 1')。format(sql.Identifier('public.wc_test'))) ProgrammingError:关系“public.wc_test”不存在 第1行:从“public.wc_test”限制1
中选择*
Here is the screenshot of the code and output
新问题:
我似乎又用另一个表得到了同样的问题,即使我将模式和表名分开了。您有什么想法会导致此错误吗?谢谢!
答案 0 :(得分:1)
架构和表名必须单独传递,否则它们将像"public.wc_text"
中一样被引用,它应该是"public"."wc_test"
。所以要么
cursor.execute(
sql.SQL('select * from public.{} limit 1').format(
sql.Identifier('wc_test')
)
)
或
cursor.execute(
sql.SQL('select * from {}.{} limit 1').format(
sql.Identifier('public'),
sql.Identifier('wc_test')
)
)
答案 1 :(得分:0)
您可以使用AsIs postrgresql扩展方法:
适配器符合ISQLQuote协议,该协议对于其字符串表示已作为SQL表示有效的对象非常有用。
import psycopg2
from psycopg2.extensions import AsIs
QUERY = 'SELECT * from %(table)s limit 1'
data = {'table': AsIs('public.wc_test')}
with conn.cursor() as cursor:
cursor.execute(QUERY, data)
rows = cursor.fetchall()
return rows