Что делать, если в базе данных отсутствует колонка для хранения баланса пользователя или она неправильно инициализирована?
Что проверяют
Полезете ли вы править боевую схему руками. Ждут миграцию, безопасную последовательность шагов на живой таблице и понимание, что баланс это деньги: тип, инварианты и конкурентное изменение важнее самого факта добавления колонки.
Как отвечать
Сначала отделите «колонки нет» от «значения неверные»: первое лечится миграцией, второе разовым исправлением данных, и в один шаг их лучше не смешивать.
Порядок на живой таблице:
- добавить колонку как nullable и без вычисляемого значения, чтобы
ALTER TABLEне переписывал таблицу целиком и не держал блокировку; - заполнить пачками по первичному ключу, а не одним
UPDATEна всю таблицу: длинная транзакция раздувает журнал и мешает остальным; - только после этого поставить
NOT NULLи ограничение вродеCHECK (balance >= 0); - всё оформить обратимой миграцией в инструменте миграций проекта, с работающим откатом.
По самому полю: деньги не хранят в float, берут NUMERIC или целое число минимальных единиц. Менять значение нужно в базе (UPDATE accounts SET balance = balance + %s) либо под блокировкой строки: чтение в Python, прибавление и запись обратно теряют параллельные операции.
Где спотыкаются
Считают источником истины саму колонку. Надёжнее вести журнал операций, а баланс держать производным значением, иначе расхождение нечем объяснить и не с чем сверить.
Второе: чинят данные из консоли на проде. Изменение, которого нет в миграциях, не доедет до других окружений и потеряется при следующем развёртывании стенда.
Третье: приносят команды не из той СУБД. DESCRIBE users это MySQL, в PostgreSQL структуру смотрят через \d users или системный каталог, и такая мелочь выдаёт, что человек схему руками не трогал.