postgresql ProgrammingError:函数标识符(未知)不存在

时间:2019-03-23 06:56:59

标签: python postgresql psycopg2

我正在尝试使用psycopg2.sql.SQL来编写查询。我已经提到了文档,但无法执行它。我不断收到上述编程错误

这是示例代码:

import psycopg2.sql as sql

query = sql.SQL("SELECT id from {} where country={}".format(sql.Identifier('country_sector'), sql.Identifier('UK')))

cur = dbobj.conn.cursor()
cur.execute(query)
data = cur.fetchall()

这是错误:

ProgrammingError: function identifier(unknown) does not exist
LINE 1: SELECT id from Identifier('country_sector') where country=Id...
                       ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

这向我建议我需要在postgres中安装一些扩展,但是很多谷歌搜索并没有帮助。

任何建议都值得赞赏。

2 个答案:

答案 0 :(得分:1)

您错误地使用了format()。可行

import psycopg2
import psycopg2.sql as sql
conn=psycopg2.connect("dbname='mydb' user='myuser' ")
cur = conn.cursor()
cur.execute(
sql.SQL("SELECT id from {} 
        where country=%s").format(sql.Identifier('country_sector')),
['UK']
)
data = cur.fetchall()

答案 1 :(得分:0)

我遇到了同样的问题,该解决方案可能会有所帮助。

主要建议是,您应使用psycopg2.sql.format()来格式化所有命名文字。

对于表标识符,请注意,在版本2.7.7中,sql.Identifier()仅接受单个参数(在2.8中添加了多个字符串args)。如果您使用的是2.7.7,则应像这样格式化sql模板:

template = "SELECT * FROM {schema}.{table} WHERE date BETWEEN {ds} and {de}"
params = {
    "schema": sql.Identifier("myschema"),
    "table": sql.Identifier("mytable"),
    "ds": sql.Literal("2019-09-01"),
    "de": sql.Literal("2019-10-01")
}
query = sql.SQL(template).format(**params)

如果操作正确,则type(query)应该是<class 'psycopg2.sql.Composed'>

我的理解是,执行中的vars参数主要旨在传递INSERT等值。