ГДЕ В псипог2 пункт не форматируется - PullRequest
0 голосов
/ 08 ноября 2019

У меня возникли проблемы с использованием предложений WHERE $VARIABLE IN в psycopg2:

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». Я делал это и до сих пор не могу определить, где находится разрыв.

1 Ответ

1 голос
/ 08 ноября 2019

Ознакомьтесь с документацией 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())
...