Python: SQL
Теория: Запросы
Как правило, запросы в базу формируются динамически на основе данных, которые поступают из вне. Например, создание пользователя чаще всего происходит во время регистрации. В таком случае код вставки выглядит так:
Запросы составленные таким образом несут в себе серьезную опасность называемую SQL-инъекцией. Вместо обычных данных, пользователь может отправить текст, изменяющий SQL-запрос на тот, который нужен пользователю. Представьте что внутри переменной бы хранилась строка ') INSERT INTO users (username, phone) VALUES ('i am hacker', '777777'). В таком случае, после подстановки мы бы получили следующий запрос:
Фактически вместо одного запроса получилось два. Таким образом, опытный взломщик может выполнить произвольный запрос в базу данных удалив, добавив или изменив все что ему нужно.
В разработке существует правило - никогда не доверяй пользовательским данным. В случае работы с базой данных, это особенно важно. Любые данные перед вставкой должны быть экранированы. Делается это с помощью специальных плейсхолдеров:
Позиционные плейсхолдеры %s, которые расставляются в тех местах, где ожидается подстановка данных. Также плейсхолдеры могут быть и именованными %(имя)s.
Напоследок несколько полезных советов по построению запросов:
- Плейсхолдер должен быть %s даже если тип подставляемого значения отличается от строки
- Не заключайте плейсходер в кавычки
- Если в запросе используется знак %, он должен быть указан как %%
Ускорение запросов
Psycopg2 предоставляет дополнительные функции execute_batch() и execute_values() для исполнения множества запросов за один раз.
Возврат идентификатора
Когда мы вставляем данные в базу, иногда нам нужно получить идентификатор вставленной записи и потом использовать его в коде. Например, когда мы создаем какую-то сущность и хотим потом ее использовать:
К сожалению, Psycopg2 не предоставляет встроенного инструмента для получения id записей, но для этого мы можем использовать синтаксис SQL:
Рекомендуемые программы
Завершено
0 / 7

