WHERE IN psycopg2 子句未格式化

WHERE IN psycopg2 clause not formatting

我在 psycopg2 中使用 WHERE $VARIABLE IN 子句时遇到问题:

from app.commons.database import conn

from psycopg2 import sql
from psycopg2.extras import DictCursor

query = '''
    SELECT
        *
    FROM
        {}.{}
    WHERE
        {} in %s
    '''.format(
        sql.Identifier('information_schema'),
        sql.Identifier('tables'),
        sql.Identifier('table_schema')
    )

data = (
    'information_schema',
    'pg_catalog'
)

with conn.cursor(cursor_factory=DictCursor) as cursor:
    cursor.execute(query, data)
    print(cursor.fetchall())

加注

TypeError: not all arguments converted during string formatting

我已经阅读了关于同一主题的看似数百篇帖子,压倒性的答案是:"you need to use tuples when submitting data as the second argument to cursor.execute"。我一直在这样做,但似乎仍然无法确定差距在哪里。

查看 Lists adaptation

上的 psycopg2 文档

您收到该错误是因为 psycopg2 试图替换这两个参数,但您只给了它一个参数。尝试更改为:

from app.commons.database import conn

from psycopg2 import sql
from psycopg2.extras import DictCursor

query = '''
    SELECT
        *
    FROM
        {}.{}
    WHERE
        {} =ANY(%s)
    '''.format(
        sql.Identifier('information_schema'),
        sql.Identifier('tables'),
        sql.Identifier('table_schema')
    )

data = [
    'information_schema',
    'pg_catalog'
] # A list now, instead of a tuple

with conn.cursor(cursor_factory=DictCursor) as cursor:
    cursor.execute(query, (data, )) # A tuple, containing your list
    print(cursor.fetchall())