
INSERT и параметры: как добавить расход безопасно
Добавляем операции по одной и пачкой, узнаём границы SQL-параметров и отделяем данные пользователя от текста запроса. Это защищает и кавычки в заметке, и базу от SQL-инъекции.
Зачем это нужно
Заметка Книга О'Райли содержит апостроф. Если склеить её с SQL, запрос сломается; если ввод злоумышленный, он может изменить смысл команды. Параметры передают значение отдельно от программы запроса.
Образ. Запрос — бланк с пустыми клетками, параметры — значения в клетках. Они не могут дорисовать на бланке новую команду.
Сразу целиком
В командной строке данные можно добавить буквально:
INSERT INTO transactions
(account_id, category_id, happened_on, amount_tiyn, note)
VALUES
(1, 2, '2026-09-15', 735000, 'Groceries');
В приложении значения всегда передаются параметрами. Пример на Python показан только как граница между приложением и SQL:
db.execute(
"""INSERT INTO transactions
(account_id, category_id, happened_on, amount_tiyn, note)
VALUES (?, ?, ?, ?, ?)""",
(1, 2, "2026-09-15", 735000, "Книга О'Райли"),
)
Разбор
Перечень столбцов пишется явно: изменение порядка таблицы тогда не изменит смысл вставки. Одна команда может добавить несколько строк через несколько групп VALUES — так устроен seed.sql.
Параметр может заменить только значение. Имя таблицы, столбца или направление сортировки параметром не передают; допустимые идентификаторы выбирает код из заранее заданного списка.
Не используйте INSERT OR REPLACE как универсальное «обновить». В SQLite это удаление конфликтующей строки с последующей вставкой, что может изменить ключ и повлиять на связи. Для намеренного обновления существует UPDATE, а для upsert — INSERT ... ON CONFLICT DO UPDATE с явно выбранным конфликтом.
Карта урока
Скажите своими словами
- Почему список столбцов лучше писать явно?
- Что параметр может заменить и чего не может?
- Чем опасна склейка строки SQL с пользовательским вводом?
Задание
Добавьте расход 3 200,50 ₸ на транспорт 16 сентября со счёта Card. Сумму переведите в тиыны до запроса.
Куда это встанет в проекте
seed.sql создаёт одинаковую учебную историю. Настоящее приложение будет использовать параметризованную вставку и одну транзакцию на связанную операцию.
Ответы
Показать ответы
INSERT INTO transactions
(account_id, category_id, happened_on, amount_tiyn, note)
VALUES (1, 4, '2026-09-16', 320050, 'Transport');
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.