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)'