Shanraq.org Shanraq.org
INSERT и параметры: как добавить расход безопасно
IT

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 с явно выбранным конфликтом.

Карта урока

Текст запроса отделён от значений

Скажите своими словами

  1. Почему список столбцов лучше писать явно?
  2. Что параметр может заменить и чего не может?
  3. Чем опасна склейка строки 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');

Источники

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить задание

Сначала решите и запустите в VS Code — редактор покажет ошибку на месте. Готовое решение вставьте сюда. Проверяет модель: она укажет на ошибку, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.