- Move psycopg2-binary to optional [server] extra with lazy import
- Replace silent fallback PostgreSQL URL with ValueError
- Add TODO for wiring resolve_database_url into engine paths
- Add pool-parameter source comment in UnitOfWork
- Add read-only properties for pool params in UnitOfWork
- Add UUID/INTERVAL/ARRAY/JSONB to portable type allowlist
- Add development-only warning to Docker Compose credentials
- Update BDD scenario for new ValueError behavior
Add PostgreSQL support as the server-mode storage backend alongside
existing SQLite for local mode. Verify all ORM models are dialect-
agnostic, configure connection pooling for multi-user access, add
Docker Compose for local PG development, and wire database URL
selection based on deployment mode.
Changes:
- Add psycopg2-binary dependency to pyproject.toml
- Add server_mode, db_pool_size, db_max_overflow, db_pool_recycle
settings to Settings with environment variable support
- Add resolve_database_url() and is_postgresql() to Settings for
mode-aware database URL resolution
- Configure UnitOfWork engine creation with pool_size, max_overflow,
pool_recycle, and pool_pre_ping for PostgreSQL connections
- Update MigrationRunner to handle both SQLite and PostgreSQL backends
- Add compare_type=True to Alembic env.py for dialect-aware migrations
- Add docker-compose.yml with PostgreSQL 16-alpine for local development
- Add Behave BDD feature (14 scenarios) covering settings, pool config,
engine creation, ORM dialect compatibility, and migration runner
- Add Robot Framework integration tests (12 test cases) for the
abstraction layer with requires_postgresql tag for live PG tests
ISSUES CLOSED: #878