Serverless databases like Neon can scale down to zero when not in use. That’s great for saving money, but it means your app might hit a sleeping database and get a broken connection. If you’re running FastAPI on a serverless platform like Google Cloud Run, this is even more likely. You need a way to make sure your app reconnects automatically.
That’s where pool_pre_ping=True comes in. It tells SQLAlchemy to test the database connection before using it. If the connection is dead, SQLAlchemy will reconnect for you.
You can read more about SQLAlchemy connection pooling in the official documentation.
Serverless databases can drop connections when they scale down. If your app tries to use a stale connection, you’ll get errors. With pool_pre_ping=True, SQLAlchemy checks the connection before each use. If it’s broken, it reconnects. This keeps your app running smoothly, even if the database was asleep.
Here’s how you can set up your FastAPI app to use a serverless Postgres database (like Neon) with SQLModel and SQLAlchemy.
from sqlmodel import Session, create_engine from app.config.main import get_settings settings = get_settings() # Check for required environment variables required_vars = [ settings.POSTGRES_USER, settings.POSTGRES_PASSWORD, settings.POSTGRES_HOST, settings.POSTGRES_PORT, settings.POSTGRES_DATABASE_NAME, ] if not all(required_vars) or not str(settings.POSTGRES_PORT).isdigit(): raise ValueError("Database environment variables are missing or invalid. Please check your .env file.") # Example for Neon (add channel_binding if needed) SQLALCHEMY_DATABASE_URL = ( f"postgresql+psycopg2://{settings.POSTGRES_USER}:{settings.POSTGRES_PASSWORD}" f"@{settings.POSTGRES_HOST}:{settings.POSTGRES_PORT}/{settings.POSTGRES_DATABASE_NAME}" "?sslmode=require&channel_binding=require" ) engine = create_engine( SQLALCHEMY_DATABASE_URL, pool_pre_ping=True, ) def get_session(): """Yields a SQLModel Session instance.""" with Session(engine) as session: yield session
You’ll need a .env file with your database settings. Here’s what it might look like:
POSTGRES_USER=your_user POSTGRES_PASSWORD=your_password POSTGRES_HOST=your_host POSTGRES_PORT=your_port POSTGRES_DATABASE_NAME=your_database
Want to learn more about organizing your FastAPI settings and using .env files? Read our article on Centralizing Your FastAPI Configuration Settings with Pydantic v2 and .env Files.
Make sure these values match your database provider’s settings. If you’re using NeNeonon, or another cloud Postgres, check their dashboard for the right connection info.
If you need a guide on connecting FastAPI to a SQL database and building CRUD APIs, see: Connecting FastAPI to a Database with SQLModel
Using pool_pre_ping=True is a simple way to avoid broken connections with serverless databases. It’s not magic, but it solves a real problem. If you’re running FastAPI on Cloud Run, or using a database that can sleep, add this to your setup. Your app will be more reliable, and you’ll spend less time chasing down connection errors.
About the Author
David Muraya is a Solutions Architect specializing in Python, FastAPI, and Cloud Infrastructure. He is passionate about building scalable, production-ready applications and sharing his knowledge with the developer community. You can connect with him on LinkedIn.
Related Blog Posts
Enjoyed this blog post? Check out these related posts!

Connecting FastAPI to a Database with SQLModel
A practical guide to building CRUD APIs with FastAPI and SQLModel.
Read More...

Reusable Model Fields in SQLModel with Mixins
A Guide to Creating DRY Database Models with Timestamps and Base Models.
Read More...

How to Protect Your FastAPI OpenAPI/Swagger Docs with Authentication
A Guide to Securing Your API Documentation with Authentication
Read More...

A Practical Guide to FastAPI Security
A Comprehensive Checklist for Production-Ready Security for a FastAPI Application
Read More...
Contact Me
Have a project in mind? Send me an email at hello@davidmuraya.com and let's bring your ideas to life. I am always available for exciting discussions.