91 lines
3.5 KiB
Markdown
91 lines
3.5 KiB
Markdown
# Phase 14: PostgreSQL Migration - Discussion Log
|
|
|
|
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
|
|
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
|
|
|
|
**Date:** 2026-04-04
|
|
**Phase:** 14-postgresql-migration
|
|
**Areas discussed:** Migration strategy, Data migration script, Test infrastructure, Docker Compose layout
|
|
**Mode:** --auto (all decisions auto-selected as recommended defaults)
|
|
|
|
---
|
|
|
|
## Migration Strategy
|
|
|
|
| Option | Description | Selected |
|
|
|--------|-------------|----------|
|
|
| Clean schema rewrite | Rewrite schema.ts using drizzle-orm/pg-core with fresh migration history | ✓ |
|
|
| Convert existing migrations | Transform SQLite migrations to Postgres equivalents | |
|
|
| Dual-dialect schema | Maintain both SQLite and Postgres schema definitions | |
|
|
|
|
**User's choice:** [auto] Clean schema rewrite (recommended default)
|
|
**Notes:** SQLite and Postgres dialects differ enough (type system, auto-increment vs serial, pragma vs native features) that converting migrations is error-prone. Fresh start is cleaner.
|
|
|
|
| Option | Description | Selected |
|
|
|--------|-------------|----------|
|
|
| Fresh Postgres migration history | New directory, archive SQLite migrations | ✓ |
|
|
| Convert SQLite migrations | Rewrite each .sql file for Postgres | |
|
|
|
|
**User's choice:** [auto] Fresh Postgres migration history (recommended default)
|
|
**Notes:** 10 existing SQLite migrations would need manual conversion. Starting fresh avoids dialect translation bugs.
|
|
|
|
---
|
|
|
|
## Data Migration Script
|
|
|
|
| Option | Description | Selected |
|
|
|--------|-------------|----------|
|
|
| Standalone TypeScript script | Reads SQLite, writes Postgres, one-time use | ✓ |
|
|
| Drizzle migration | Built into the migration pipeline | |
|
|
| SQL dump + import | pg_dump-style approach | |
|
|
|
|
**User's choice:** [auto] Standalone TypeScript script (recommended default)
|
|
**Notes:** One-time operation that doesn't belong in the migration pipeline. Script can handle type conversions explicitly.
|
|
|
|
---
|
|
|
|
## Test Infrastructure
|
|
|
|
| Option | Description | Selected |
|
|
|--------|-------------|----------|
|
|
| Per-test PGlite instance | Fresh database per test, migrations applied each time | ✓ |
|
|
| Shared PGlite with transaction rollback | One instance, wrap each test in a rolled-back transaction | |
|
|
| Shared PGlite with cleanup | One instance, truncate tables between tests | |
|
|
|
|
**User's choice:** [auto] Per-test PGlite instance (recommended default)
|
|
**Notes:** Matches current in-memory SQLite pattern. Avoids test pollution. PGlite is lightweight enough for per-test instances.
|
|
|
|
---
|
|
|
|
## Docker Compose Layout
|
|
|
|
| Option | Description | Selected |
|
|
|--------|-------------|----------|
|
|
| Separate dev compose file | docker-compose.dev.yml with Postgres for development | ✓ |
|
|
| Single compose with profiles | Use Docker Compose profiles for dev vs prod | |
|
|
| Extend existing compose | Add Postgres to the single docker-compose.yml | |
|
|
|
|
**User's choice:** [auto] Separate dev compose file (recommended default)
|
|
**Notes:** Separation of concerns. Production compose will also need Postgres eventually but with different configuration.
|
|
|
|
| Option | Description | Selected |
|
|
|--------|-------------|----------|
|
|
| PostgreSQL 16 | Latest stable release | ✓ |
|
|
| PostgreSQL 15 | Previous stable | |
|
|
|
|
**User's choice:** [auto] PostgreSQL 16 (recommended default)
|
|
|
|
---
|
|
|
|
## Claude's Discretion
|
|
|
|
- Drizzle Postgres driver choice (node-postgres vs postgres-js)
|
|
- PGlite configuration details
|
|
- Column type mapping specifics
|
|
- Migration script error handling
|
|
- Test driver choice for PGlite
|
|
|
|
## Deferred Ideas
|
|
|
|
None
|