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)
Другие вопросы по тегам