SQLAlchemy Python SQL toolkit
Light · Postcard
102 × 152 mm · PDF
Dark · Postcard
102 × 152 mm · PDF
Ink saver · Postcard
102 × 152 mm · PDF
Light · A4 landscape
297 × 210 mm · PDF
Dark · A4 landscape
297 × 210 mm · PDF
Ink saver · A4 landscape
297 × 210 mm · PDF
Light · A3 landscape
420 × 297 mm · PDF
Dark · A3 landscape
420 × 297 mm · PDF
Ink saver · A3 landscape
420 × 297 mm · PDF
Start here
create_engine("<url>")
class User(Base)
Base.metadata.create_all(engine)
with Session(engine) as s:
s.add(obj)s.scalars(select(User))
s.commit()relationship()Concepts
- Engine URL + pool
- Connection Core, raw SQL
- Session ORM unit of work
- Mapped objects identity map
Engine
from sqlalchemy import create_engine
create_engine("sqlite:///app.db")
create_engine("postgresql+psycopg://<user>:<pw>@<host>/<db>")
create_engine("sqlite://", echo=True)
from sqlalchemy import text
with engine.connect() as conn:
conn.execute(text("SELECT 1"))
conn.execute(text("... :id"), {"id":
5})
with engine.begin() as conn:
Declare models
class Base(DeclarativeBase): pass
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(50))
email: Mapped[Optional[str]]
mapped_column(unique=True, index=True)
mapped_column(ForeignKey("user.id"))
Base.metadata.create_all(engine)
Session
from sqlalchemy.orm import Session
with Session(engine) as session:
session.add(<obj>)
session.add_all([<a>, <b>])
session.commit()
session.rollback()
session.delete(<obj>)
session.get(User, <pk>)
with Session(engine) as s, s.begin():
sessionmaker(engine)
Query
from sqlalchemy import select
session.scalars(select(User)).all()
select(User).where(User.name == "ann")
session.scalars(stmt).first()
session.scalar(stmt)
session.scalars(stmt).one()
session.execute(select(User.id, User.name))
select(User).order_by(User.name.desc())
select(User).limit(<n>).offset(<n>)
.where(User.age >= 18, User.active.is_(True))
.where(or_(<a>, <b>))
.where(User.id.in_([1, 2]))
select(func.count()).select_from(User)
select(Order.user_id,
func.sum(Order.total)).group_by(Order.user_id)
Insert, update, delete
insert(User).values(name="ann")
session.execute(insert(User), [{"name":
"a"}, ...])
user.name = "bob"
update(User).where(<cond>).values(name="x")
delete(User).where(<cond>)
Relationships
posts: Mapped[list["Post"]] =
relationship(back_populates="author")
author: Mapped["User"] =
relationship(back_populates="posts")
user_id: Mapped[int] =
mapped_column(ForeignKey("user.id"))
relationship(cascade="all, delete-orphan")
relationship(secondary=<table>)
user.posts.append(Post(title="x"))
select(User).options(selectinload(User.posts))
select(Post).options(joinedload(Post.author))
Joins
select(User, Post).join(Post)
select(User).join(User.posts)
select(User).join(Post, User.id == Post.user_id)
select(User).join(User.posts, isouter=True)
Alembic migrations
pip install alembic
alembic init <dir>
target_metadata = Base.metadata
alembic revision --autogenerate -m
"<msg>"
alembic upgrade head
alembic downgrade -1
alembic currentRecipes
class Base(DeclarativeBase): passclass User(Base): __tablename__ = "user" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str]engine = create_engine("sqlite:///app.db")Base.metadata.create_all(engine)
with Session(engine) as s: s.add(User(name="ann")) s.commit() for u in s.scalars(select(User)): print(u.id, u.name)
stmt = (select(User.name, func.count(Post.id)) .join(User.posts, isouter=True) .group_by(User.id))rows = session.execute(stmt).all()
SessionLocal = sessionmaker(engine)def get_db(): with SessionLocal() as s: yield s



