Skip to content

SQLAlchemy

Tested with: SQLAlchemy 2.0.36 · psycopg 3.2 · PyMySQL 1.1 · Alembic 1.13 · Python 3.12

db.py
import os
from sqlalchemy import create_engine
engine = create_engine(
"postgresql+psycopg://app:%s@pg-7f3k.us-east.databasezy.com:5432/app" % os.environ["ZB_PASSWORD"],
connect_args={"sslmode": "verify-full", "sslrootcert": "databasezy-ca.pem"},
pool_size=5,
max_overflow=0,
pool_pre_ping=True, # detects connections dropped by a free-tier sleep
pool_recycle=1800,
)

Async: create_async_engine("postgresql+psycopg://...") takes the same connect_args.

alembic.ini (excerpt)
sqlalchemy.url = postgresql+psycopg://app:%(ZB_PASSWORD)[email protected]:5432/app?sslmode=verify-full&sslrootcert=databasezy-ca.pem

Run alembic upgrade head from CI or a Kubernetes Job against the direct endpoint. With the pooled endpoint at runtime, set prepare_threshold=None on psycopg (connect_args) so prepared statements are not reused across pooled sessions.