😱 MySQL молча потерял данные. Без ошибки Коллеги, данные записывались. Данные были пустыми. Ошибки не было.
Типы перемещений не совпадали с MySQL enum. БД молча обрезала значения.
📍Что происходило В коде: движения типа "internal_transfer", "supplier_delivery", "customer_return"
В MySQL: enum('transfer', 'delivery', 'return')
MySQL принимал запросы, но сохранял пустые строки. Никаких ошибок в логах.
📍Как нашёл Code review с AI на предмет консистентности: "Сравни типы данных в коде с схемой базы"
AI нашёл несоответствие через dbml-анализ. Проверил таблицу: 847 записей с пустым типом движения.
📍Почему молча MySQL в режиме по умолчанию (не strict mode):
- Обрезает строки длиннее лимита
- Игнорирует enum значения вне списка
- Вставляет пустые строки вместо ошибок
Это "фича" совместимости с древними приложениями.
📍Исправление
- sql_mode = STRICT_TRANS_TABLES
- Обновил enum в схеме
- Миграция данных (восстановил 847 записей)
- Добавил валидацию в приложении
Теперь ошибки падают громко, как и должно быть.
📍Урок Silent failures хуже громких ошибок. Лучше упасть с traceback, чем молча потерять данные.
Всегда включайте strict mode в production БД.
Как настроил мониторинг целостности данных для всех проектов. Чеклист database safety в бесплатном гиде.
#моикейсы_поповвии Работаем дальше.