--- title: "1.19.0 — Bounded PostgreSQL pooling and complete transactional email templates" description: "django-mojo 1.19.0 uses bounded, health-checked psycopg 3 pools for PostgreSQL under ASGI, completes the built-in transactional account email templates, and treats paid database/cache redundancy as an explicit availability choice." date: "2026-08-24" tags: ["release"] canonical: "https://django-mojo.sitesmojo.com/changelog/1-19-0/" --- django-mojo 1.19.0 uses bounded, health-checked psycopg 3 pools for PostgreSQL under ASGI, completes the built-in transactional account email templates, and treats paid database/cache redundancy as an explicit availability choice. ### Breaking - PostgreSQL deployments now standardize on psycopg 3 with its native pool package. Django ORM users should be transparent, but application code that imports `psycopg2` directly or relies on psycopg2-specific raw-driver behavior must migrate or be tested before upgrading. - Otherwise-unconfigured PostgreSQL aliases now receive a native pool per process with `min_size=1`, `max_size=4`, `timeout=5`, `max_idle=300`, and `max_lifetime=1800`; `CONN_MAX_AGE` remains `0` as required for Django pooling under ASGI. With the default four Uvicorn workers this permits up to 16 connections per node per alias. ### Added - Default templates now cover every built-in transactional account email flow, including invitations, magic login, password reset, email verification, email change, and account deactivation. ### Changed - Derived database-reader aliases receive an independent bounded pool instead of a 60-second persistent connection. - Transactional link emails now render server-resolved frontend URLs instead of raw tokens or placeholder hosts. - The reference AWS audit now treats a writer-only Aurora cluster or single-node cache as an explicit cost/recovery choice rather than a deployment failure; misconfigured paid replicas remain visible as warnings. ### Fixed - Missing template seeds and placeholder-host link templates no longer silently leave built-in account flows with unusable email. ### Upgrade notes - Replace the default pool globally with `DATABASE_POOL_OPTIONS`, or set it to `False` to disable automatic pooling. An explicit per-alias `CONN_MAX_AGE` or the legacy `DATABASE_CONN_MAX_AGE` also opts that alias out. - Size connection capacity as `nodes × Uvicorn workers × sum(alias max_size)`, leaving headroom for migrations, background processes, operators, and failover. - RDS Proxy and PgBouncer remain separate infrastructure layers. Transaction-mode poolers require `DISABLE_SERVER_SIDE_CURSORS = True`; django-mojo's session advisory-lock paths must be isolated or redesigned before using PgBouncer transaction mode. RDS Proxy preserves those paths by pinning their client connections, reducing multiplexing. - Shipped template loading remains missing-only and will not overwrite customized database rows. Run `python manage.py seed_email_templates --update-existing` only when you intend to replace existing templates with the shipped versions.