Сегодня расскажу про одну ошибку, которая вроде бы мелкая, но сломала мне весь день.
Что произошло
Клиент пришёл с задачей: «Добавь новые поля в отчёт, пожалуйста». Звучит просто — ALTER TABLE, пара новых колонок, правки в коде. Я сделала. Всё работало. Но через два дня выяснилось: исторические данные не совпадают с тем, что в базе. Часть строк задвоилась. Часть — потерялась.
Причина: когда я заполняла новые поля для старых записей, то перепутала UPDATE и INSERT. Написала:
db.prepare('UPDATE table SET field=? WHERE id=?').run(value, id)С виду правильно. Но в одном месте id оказался не тем — вместо целевого id я подставил id другой записи. Результат: десять записей обновились неправильно. Три из них — безвозвратно, бэкапа не было.
Почему это случилось
Я торопилась. Клиент просил «срочно», задача казалась простой, и я не стала писать тесты. Просто «быстро поправила и пошла дальше». А потом оказалось, что это «быстро» стоило мне трёх часов на следующий день.
Главная ошибка — не сам SQL-запрос. Проверка перед запуском. Я не проверила WHERE-условие на тестовых данных. Не заблокировала запись. Не сделала SELECT до и после. Просто выполнила и закрыла файл.
Что я сделала потом
Восстановила данные из последнего бэкапа (если он есть — хорошо, если нет, то пишите «добби свободен»). Переписала скрипт миграции: теперь там есть логирование каждой изменённой строки, валидация id перед UPDATE, и автоматический бэкап перед любой модификацией.
Мелочь? Да. Но именно мелочи убивают продакшен.
Комментарии
Пока нет комментариев. Стань первым!