使用 SQL 模块时出现 Psycopg2 格式错误

Psycopg2 formatting error when using SQL module

我想这对某些人来说会很简单,但我想不通...

我正在按照说明 here 动态开发 SQL 查询。在创建 postgresql 连接和游标对象后,我使用 psycopg2 sql 模块创建一个带有如下参数的查询:

query = sql.SQL("SELECT * FROM {t_name} WHERE {col} in %s;".format(
    t_name=sql.Identifier(table_name),
    col=sql.Identifier(fips_col)))

这个结果很好(据我所知):

SQL("SELECT * FROM Identifier('cb_tracts') WHERE Identifier('st_cnty_fips') in %s;")

然后我尝试使用参数(或参数列表)执行:

cursor.execute(query, ('06037',))

cursor.execute(query, (['06037'],))

但是我收到这个错误:

psycopg2.errors.SyntaxError: syntax error at or near "'06073'"
LINE 1: ...er('cb_tracts') WHERE Identifier('st_cnty_fips') in '06073';

和这个错误,分别是:

psycopg2.errors.SyntaxError: syntax error at or near "ARRAY"
LINE 1: ...('cb_tracts') WHERE Identifier('st_cnty_fips') in ARRAY['060...

SQL IN (...) 实际上是句法结构而不是函数或类似的东西。这意味着它采用逗号分隔的文字值列表,而不是作为列表的单个值(如果您能看到差异)。

这意味着几乎每个数据库驱动程序使用的值绑定都不能与 IN (...) 一起工作,尽管每个人都认为它应该。

在 PostgreSQL 中将列表表示为单个值的方式是数组。检查数组成员资格的方法是

... my_column = ANY(%s)