Интерполировать неэкранированную строку в Python

Курсор psycopg2 принимает строку с экранированными подстроками, которые представляют значения text / char / varchar. Например, чтобы использовать хранимые процедуры, которые вставляются в таблицу:

cur.execute('SELECT insert_profile("name", "favorite color example")')

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

Я пытался просто использовать двойные кавычки для переменных и одинарные кавычки для строкового литерала, но это просто выполняет обычную операцию. Например:

name = "Harry"
color = "Blue"
cur.execute('SELECT insert_profile({0}, {1})'.format(name, color)

Я также пытался вложить переменные, но он вставляет буквенную вложенную строку в базу данных:

name = "'Harry'"
color = "'Blue'"

Какой правильный подход? Извините, если ответ в другом месте на SO или в Интернете. Я не имел успеха, оглядываясь вокруг.

1 ответ

Решение

С веб-страницы psycopg:

cur.execute(
...     """INSERT INTO some_table (an_int, a_date, another_date, a_string)
...         VALUES (%(int)s, %(date)s, %(date)s, %(str)s);""",
...     {'int': 10, 'str': "O'Reilly", 'date': datetime.date(2005, 11, 18)})

Строка запроса содержит заполнители, которые ссылаются на ключи в словаре, и драйвер будет интерполировать значения с помощью соответствующих кавычек, экранирования и т. Д., Что может избавить вас от многих проблем.

Что еще более важно: вы никогда не должны строить запросы с помощью строковых операций, таких как операция concat или format, Это оставляет огромную дыру в безопасности из-за внедрения SQL. Пусть водитель сделает тяжелую работу!

Другие вопросы по тегам