Databases Basics
9 examples for Python database fundamentals - 6 basic and 3 intermediate.
Search across all documentation pages
9 examples for Python database fundamentals - 6 basic and 3 intermediate.
uv pip install "sqlalchemy>=2.0" alembic asyncpg psycopg[binary]Connect with a PEP 249 driver.
import sqlite3
with sqlite3.connect("app.db") as conn:
conn.execute("CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)")
conn.execute("INSERT INTO items(name) VALUES (?)", ("widget",))Related: SQLAlchemy Core - engine layer
Commit and rollback explicitly.
conn.execute("BEGIN")
try:
conn.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
conn.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
conn.commit()
except Exception:
conn.rollback()
raiseRelated: Connection Management - pool scope
Create an engine and execute text.
from sqlalchemy import create_engine, text
engine = create_engine("sqlite:///app.db")
with engine.begin() as conn:
conn.execute(text("SELECT 1"))Map a class to a table.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Item(Base):
__tablename__ = "items"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column()Related: SQLAlchemy ORM 2.0 - sessions
Read rows with a session.
from sqlalchemy import select
from sqlalchemy.orm import Session
with Session(engine) as session:
rows = session.scalars(select(Item)).all()Persist a new entity.
with Session(engine) as session:
session.add(Item(name="bolt"))
session.commit()Start migration history.
# alembic init alembic
# edit alembic.ini sqlalchemy.url
# alembic revision --autogenerate -m "init"
# alembic upgrade headRelated: Migrations with Alembic - workflows
Non-blocking PostgreSQL access.
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db")Related: Async Database Access - sessions
Cache hot reads.
import redis
r = redis.Redis.from_url("redis://localhost:6379/0")
r.setex("item:1", 60, "cached-payload")Related: NoSQL & Caching - patterns
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 19, 2026