The migration was running clean until you hit the missing New Column. Everything stopped. You read the schema again. The data team said it was there. The database disagreed.
Adding a new column should be simple. In practice, it is where migrations break, tests fail, and production risks appear. The wrong default locks tables. NULL errors slip into logs. Deploy time grows. Each database has its own edge cases. MySQL handles it differently from Postgres. Cloud-hosted systems add another layer of constraints.
Plan the operation. Start by defining the new column with the smallest possible change: correct type, clear defaults, non-blocking where possible. In Postgres, use ALTER TABLE ... ADD COLUMN with a default only if safe for large datasets. For massive tables, create the new column without default values, backfill in controlled batches, and then add the default constraint. This avoids full table locks and keeps latency stable.
Test in a staging environment that mirrors production scale. Include realistic data volumes. Confirm that your ORM mappings reflect the new column. Watch for silent casting or truncation.