Передача имени таблицы и списка значений в качестве аргумента в запрос psycopg2 - PullRequest
0 голосов
/ 14 января 2020

Context

Я хотел бы передать имя таблицы вместе с параметрами запроса в запросе psycopg2 в функции python3.

Если я правильно понимаю, мне не следует форматировать строку запроса, используя метод python .format() до выполнения запроса, но позвольте psycopg2 сделать это .

Проблема

Не удается передать имя таблицы и параметры в качестве аргумента в строку запроса.

Пример кода

Вот Пример кода:

import psycopg2
from psycopg2 import sql
connection_string = "host={} port={} dbname={} user={} password={}".format(*PARAMS.values())

conn = psycopg2.connect(connection_string)
curs = conn.cursor()

table = 'my_customers'
cities = ["Paris", "London", "Madrid"]
data = (table, tuple(customers))

query = sql.SQL("SELECT * FROM {} WHERE city = ANY (%s);")

curs.execute(query, data)
rows = cursLocal.fetchall()

Ошибка (и)

Но я получаю следующее сообщение об ошибке:

TypeError: not all arguments converted during string formatting

Я также пытался заменить определение data by:

data = (sql.Identifier(table), tuple(object_types))

Но затем появляется эта ошибка:

ProgrammingError: can't adapt type 'Identifier'

Если я добавлю ANY {} вместо ANY (%s) в строку запроса, в обоих предыдущих случаях эта ошибка показывает:

SyntaxError: syntax error at or near "{"
LINE 1: ...* FROM {} WHERE c...
                  ^

Изначально я не использовал модуль sql и пытался передать data в качестве второго аргумента для curs. execute() м Конечно, но имя таблицы в команде было заключено в одинарные кавычки, что вызвало проблемы Поэтому я попробовал модуль sql, но это не устарелая привычка.
Если возможно, я бы хотел оставить фигурные скобки {} для замены параметров вместо %s, кроме случаев, если это плохая идея.

Среда

Ubuntu 18.04 64 бит 5.0.0-37-generic x86_64 GNU/Linux
Python 3.6.9 (по умолчанию, 7 ноября 2019 г., 10:44:02)

psycopg2.__version__    
'2.8.4 (dt dec pq3 ext lo64)'

1 Ответ

0 голосов
/ 02 февраля 2020

Вы хотите что-то вроде:

table = 'my_customers'
cities = ["Paris", "London", "Madrid"]

query = sql.SQL("SELECT * FROM {} WHERE city = ANY (%s)").format(sql.Identifier(table))

curs.execute(query, (cities,))
rows = cursLocal.fetchall()
...