pg8000 не может параметризовать запросы
Я пытался использовать pg8000 для взаимодействия с моим сервером SQL, но по какой-то причине он не будет правильно принимать параметры. Кажется, он распознает стиль парам, а затем знает, как изменить их на параметры PostgreSQL, но, похоже, никогда не пропускает эти параметры. Я посмотрел пример документации здесь (ссылка) для примеров, и они не работали. Вот некоторые примеры:
query = """
SELECT *
FROM schema.table_name
"""
conn = pg8000.connect(**credential_dict)
cursor = conn.cursor()
cursor.execute(query)
Этот пример работает. Следующие два не:
query = """
SELECT *
FROM %s
"""
conn = pg8000.connect(**credential_dict)
cursor = conn.cursor()
cursor.execute(query, 'schema.table_name')
query = """
SELECT *
FROM %s
"""
conn = pg8000.connect(**credential_dict)
cursor = conn.cursor()
cursor.execute(query, ('schema.table_name',))
Эти запросы не выполняются, но полученная ошибка говорит о том, что ошибка находится на $1
который pg8000 преобразует %s
к.
Что я делаю неправильно?
2 ответа
В PostgreSQL некоторые части операторов SQL нельзя параметризовать . В вашем примере:
cursor.execute("SELECT * FROM %s", 'schema.table_name')
имя таблицы не может быть параметризовано, поэтому вам придется создать строку самостоятельно:
table_name = 'schema.table_name'
cursor.execute(f"SELECT * FROM {table_name}")
Попробуйте явно назвать свой параметр и передать как dict
:
param_dict = dict(table_name = 'schema.table_name')
query = """SELECT * FROM %(table_name)s"""
# cursor setup code...
cursor.execute(query, param_dict)