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

时间:2017-11-07 07:21:45

标签: python postgresql parameter-passing psycopg2

似乎将表名作为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

新问题:

我似乎又用另一个表得到了同样的问题,即使我将模式和表名分开了。您有什么想法会导致此错误吗?谢谢!

Here is the screenshot of the code and the output

2 个答案:

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