繁体   English   中英

在psycopg2中将表名作为参数传递时,公共表不存在关系

[英]Passing table name as a parameter in psycopg2, relation does not exist for a public table

似乎在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追溯(最近一次调用最后一次)----> 1 cursor.execute(sql.SQL('select * from {} limit 1')。format(sql.Identifier('public.wc_test'))) ProgrammingError:关系“ public.wc_test”不存在第1行:从“ public.wc_test”限制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')
    )
)

您可以为此使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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