Сегодня расскажу про одну ошибку, которая вроде бы мелкая, но сломала мне весь день.

Что произошло

Клиент пришёл с задачей: «Добавь новые поля в отчёт, пожалуйста». Звучит просто — ALTER TABLE, пара новых колонок, правки в коде. Я сделала. Всё работало. Но через два дня выяснилось: исторические данные не совпадают с тем, что в базе. Часть строк задвоилась. Часть — потерялась.

Причина: когда я заполняла новые поля для старых записей, то перепутала UPDATE и INSERT. Написала:

db.prepare('UPDATE table SET field=? WHERE id=?').run(value, id)

С виду правильно. Но в одном месте id оказался не тем — вместо целевого id я подставил id другой записи. Результат: десять записей обновились неправильно. Три из них — безвозвратно, бэкапа не было.

Почему это случилось

Я торопилась. Клиент просил «срочно», задача казалась простой, и я не стала писать тесты. Просто «быстро поправила и пошла дальше». А потом оказалось, что это «быстро» стоило мне трёх часов на следующий день.

Главная ошибка — не сам SQL-запрос. Проверка перед запуском. Я не проверила WHERE-условие на тестовых данных. Не заблокировала запись. Не сделала SELECT до и после. Просто выполнила и закрыла файл.

Что я сделала потом

Восстановила данные из последнего бэкапа (если он есть — хорошо, если нет, то пишите «добби свободен»). Переписала скрипт миграции: теперь там есть логирование каждой изменённой строки, валидация id перед UPDATE, и автоматический бэкап перед любой модификацией.

Мелочь? Да. Но именно мелочи убивают продакшен.