Psycopg2 параметризованный запрос на выполнение

#python #postgresql #psycopg2 #parameterized-query

#python #postgresql #psycopg2 #параметризованный запрос

Вопрос:

Пытаюсь использовать параметры в моем запросе для Postgres, используя Psycopg2. Когда я выполняю поиск в Google, я вижу, что люди используют %s но я хочу дать более описательные имена, как вы видите, что я делаю ниже, чтобы позже я мог потенциально добавить больше столбцов в предложение WHERE и оно было более легко читаемым. Возможно ли это? Что я делаю не так?

 q = ""
q  = "SELECT"
q  = " id"
q  = " FROM tbl_users "
q  = " WHERE "
q  = "("
q  = " b_enabled = (%enabled)"
q  = ")"
enabled = "True"
db_cursor.execute(q,enabled)

  

К вашему сведению: я понимаю, что в этом случае я мог бы просто указать «True» в качестве второго параметра в методе execute, но это сокращенная версия моего кода, чтобы сосредоточиться на проблеме. Я хочу знать, как поместить переменную в execute, а не жесткий код «True» в этом месте.

Сообщение об ошибке:

psycopg2.ошибки.Ошибка синтаксиса: синтаксическая ошибка в строке 1 «$» или около нее: …d_visit_last ИЗ tbl_users, ГДЕ ( b_enabled = ($t_enabled…

Ответ №1:

Возможно, вам захочется использовать многострочную строку для определения вашего SQL-запроса, чтобы предоставить более значимые имена, вы можете использовать словарь для передачи значений в psycopg2.execute():

 import psycopg2
conn = psycopg2.connect("dbname=mf port=5959 host=localhost user=mf_usr")
cur = conn.cursor()

sql = """
    SELECT
        id
    FROM tbl_users
    WHERE
        b_enabled = %(enabled)s
"""

print (cur.mogrify(sql, {'enabled': "True"}).decode('utf-8'))
# cur.execute(sql, {'enabled': "True"})
  

Вывод:

 SELECT
    id
FROM tbl_users
WHERE
    b_enabled = 'True'
  

Пожалуйста, взгляните на официальные документы для получения дополнительной информации.

Комментарии:

1. Спасибо! Еще одна вещь. Могу ли я включить переменную в том месте, где вы указали «True» в инструкции execute? Пытаюсь сейчас… ЭТО СРАБОТАЛО: db_cursor.execute(q, {'t_enabled': t_enabled})