Как Python может выполнять замену строки без% s?

62
5

Проверьте следующие строки кода Python 2.6, которые я нашел:

key = 'hire_date' 
update_dict['key'] = update_dict[key] #added e.g. {..., 'key': '12/31/1999'}
if key == 'hire_date':
query_string = "UPDATE employee SET " + key + "= CAST(%(key)s AS DATE) WHERE emp_id = '" + emp.employee + "'"

Я тестировал этот код, и он работает. Он успешно обновляет поле employee_date сотрудника в базе данных до любого значения 'key' даты в словаре.

Я был в середине параметризации, когда заметил, что %(key)s каким-то образом удается получить значение словаря в 'key'. Как оно это делает? Я всегда думал, что вам нужно добавить % dictionaryOrTupleOrWhatever после строки, чтобы это работало.

спросил(а) 2021-01-19T12:42:23+03:00 2 месяца, 4 недели назад
1
Решение
87

В коде, который вы вставили, интерполяция не происходит. Однако переменная впоследствии может быть интерполирована:

>>> x = "%(var)s" # no interpolation yet
>>> d = {'var': 88}
>>> x % d # interpolate into the stored string
'88'

Учитывая, что введенный вами код выглядит как SQL, он также может быть интерполирован позже через вызов библиотеки SQL. Многие библиотеки интерфейсов SQL предоставляют аналогичную подстановку строк с использованием знаков % и поощряют пользователей использовать их, а не встроенную подстановку строк, поскольку версии библиотеки SQL имеют различные меры предосторожности для предотвращения вредоносных инъекций.

ответил(а) 2021-01-19T12:42:23+03:00 2 месяца, 4 недели назад
75

Бьюсь об заклад, вы позже найдете в коде, что есть инструкция execute API БД, которая принимает параметр update_dict в качестве параметра. Затем API БД выполняет замену вместо форматирования строки Python и, следовательно, правильно обрабатывает привязку.

Взгляните на это: http://furius.ca/pubcode/pub/antiorm/lib/python/dbapiext.html#escaping-in-the-dbapi-2-0

ответил(а) 2021-01-19T12:42:23+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема