SQLAlchemy
Tested with: SQLAlchemy 2.0.36 · psycopg 3.2 · PyMySQL 1.1 · Alembic 1.13 · Python 3.12
import osfrom 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.
import osfrom sqlalchemy import create_engine
engine = create_engine( "mysql+pymysql://app:%s@mysql-7f3k.us-east.databasezy.com:3306/app?charset=utf8mb4" % os.environ["ZB_PASSWORD"], connect_args={"ssl": {"ca": "databasezy-ca.pem"}, "ssl_verify_cert": True, "ssl_verify_identity": True}, pool_size=5, max_overflow=0, pool_pre_ping=True, pool_recycle=1800,)Alembic
Section titled “Alembic”sqlalchemy.url = postgresql+psycopg://app:%(ZB_PASSWORD)[email protected]:5432/app?sslmode=verify-full&sslrootcert=databasezy-ca.pemRun 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.