# DB Migration Workflow (External Postgres) This project uses an external on-prem Postgres database. Migration files are canonical in: - `packages/db/migrations` ## Preconditions - `DATABASE_URL` is set and points to the on-prem Postgres instance. - `psql` is installed and available in PATH. - You are in repo root. ## Commands - Apply pending migrations: - `npm run db:migrate` - Show migration status: - `npm run db:migrate:status` - Fail if pending migrations exist: - `npm run db:migrate:verify` - Create a new migration file: - `npm run db:migrate:new -- ` - Track stale legacy SQL in `backend/migrations`: - `npm run db:migrate:stale` - Fail when stale legacy SQL exists: - `npm run db:migrate:stale:check` ## Active migration set Migration files are applied in lexicographic filename order from `packages/db/migrations`. `backend/migrations` is legacy reference-only and not part of canonical execution. `packages/db/migrations/stale-files.json` is the source of truth for canonical files that are intentionally stale/ignored. Current baseline files: - `add_display_name_column.sql` - `add_image_columns.sql` - `add_modified_on_column.sql` - `add_notes_column.sql` - `create_item_classification_table.sql` - `create_sessions_table.sql` - `multi_household_architecture.sql` ## Tracking table Applied migrations are recorded in: - `schema_migrations(filename text unique, applied_at timestamptz)` ## Expected operator flow 1. Check status: - `npm run db:migrate:status` 2. If a new implementation needs schema changes, create a new file: - `npm run db:migrate:new -- ` 3. Apply pending: - `npm run db:migrate` 4. Verify clean state: - `npm run db:migrate:verify` ## Troubleshooting - `DATABASE_URL is required`: - Export/set `DATABASE_URL` in your environment. - `psql executable was not found in PATH`: - Install PostgreSQL client tools and retry. - SQL failure: - Fix migration SQL and rerun; only successful files are recorded in `schema_migrations`. - Skip known stale SQL files for a specific environment: - Set `DB_MIGRATE_SKIP_FILES` to a comma-separated filename list. - Example: `DB_MIGRATE_SKIP_FILES=add_modified_on_column.sql,add_image_columns.sql` - Temporarily include files listed in `stale-files.json`: - Set `DB_MIGRATE_INCLUDE_STALE=true` before running migration commands.