在psycopg2子句中未格式化

问题描述 投票:0回答:1

我在使用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:并非在格式化字符串时转换了所有参数

我已经阅读了有关同一主题的看似数百篇文章,并且压倒性的答案是:“在将数据作为cursor.execute的第二个参数提交时,您需要使用元组。”我一直在这样做,但似乎仍然无法确定差距在哪里。

python-3.x postgresql psycopg2
1个回答
1
投票
查看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())

© www.soinside.com 2019 - 2024. All rights reserved.