我正在尝试使用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中安装一些扩展,但是很多谷歌搜索并没有帮助。
任何建议都值得赞赏。
答案 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等值。