Repository navigation
fix(api): baseline Prisma migration and fail-fast migrate - #6
Conversation
The migrations folder held only ALTER migrations (the original schema was created with `db push`), so `prisma migrate deploy` failed on an empty database. Add 20260101_baseline = schema as it was before the first ALTER migration, plus migration_lock.toml. Verified on a throwaway PostgreSQL 16: baseline + the 4 existing migrations apply cleanly on an empty DB, and the resulting schema matches schema.prisma except 3 pre-existing TIMESTAMPTZ columns (contract_date x2, phone_otp_expires_at) that the old migrations created as timestamptz. The container CMD no longer masks a failed `migrate deploy` with `|| echo 'Migration skipped'`; it now exits so the error is visible in `docker logs`. Prod must run `migrate resolve --applied 20260101_baseline` once before starting the new image (documented in CLAUDE.md). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
Что сделано
prisma/migrationsлежали только ALTER-миграции (исходную схему создавали черезdb push), поэтомуprisma migrate deployне работал на пустой БД. Добавлена20260101_baseline(схема до первой ALTER-миграции, 30 таблиц, 18 enum) иmigration_lock.toml.CMDDockerfile убран|| echo 'Migration skipped (already applied)'. Еслиmigrate deployпадает, контейнер не стартует, причина видна вdocker logs.CLAUDE.md: описание миграций приведено в соответствие с новым поведением и добавлен порядок выкатки.Как проверено
На одноразовой PostgreSQL 16:
prisma migrate diffитоговой БД противschema.prismaрасходится только в трёх колонках:clients.contract_date,organizations.contract_date,users.phone_otp_expires_at. Старые миграции создали их какTIMESTAMPTZ, схема ждётTIMESTAMP(3). Это расхождение уже есть на проде, функционально безвредно, здесь не менял.migrate deployпадает сtype "UserRole" already exists, послеmigrate resolve --applied 20260101_baselineпроходит сNo pending migrations.CMD.Сначала пометить baseline применённым, иначе новый контейнер не стартует (в логе
UserRole already exists):Что осталось
TIMESTAMPTZ-колонок можно выровнять отдельной миграцией, ноALTER TYPEна боевых данных зависит от часового пояса сессии, так что это отдельная задача.🤖 Generated with Claude Code
Summary by CodeRabbit