# Database Rebuild Migration Workflow This project uses an explicit **export/import rebuild workflow** for schema migration. Policy: - Do not add runtime legacy-compatibility write paths. - Rebuild a fresh target database from current models. - Export current data/media, then import into the fresh target. ## Commands ### 1) Export current DB + uploads into a bundle ```bash uv run python tools/export_import_migration.py export --bundle-dir .migration-bundle ``` Optional source overrides: - `--source-db ` - `--source-upload-dir ` ### 2) Import bundle into a fresh DB + uploads root ```bash uv run python tools/export_import_migration.py import --bundle-dir .migration-bundle --target-db .\data\transcription-new.db --target-upload-dir .\data-new ``` ### 3) One-shot export+import ```bash uv run python tools/export_import_migration.py migrate --bundle-dir .migration-bundle --target-db .\data\transcription-new.db --target-upload-dir .\data-new ``` ## What gets migrated - Tables (in dependency order): `document_type`, `person_role`, `document`, `person`, `document_person`, `job`, `source`, `job_source`, `execution_attempt`. - Media tree under `UPLOAD_DIR`. The bundle contains: - `database.json` (row export) - `uploads/` (copied media files) Path normalization during export/import: - `source.file_path` is normalized to `documents/...` (upload-root-relative POSIX). - `person.portrait_path` is normalized to `persons/...` (upload-root-relative POSIX). ## Cutover After importing to a fresh target: 1. Stop the app. 2. Point `DATABASE__*` and `UPLOAD_DIR` to the new targets. 3. Start the app and run smoke checks (`/healthz`, create/upload/process one job).