Интерполировать неэкранированную строку в 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. Пусть водитель сделает тяжелую работу!