Skip to content
>_devvkit
$devvkit learn --librarie sqlalchemy-guide

SQLAlchemy Guide

[python][orm][database]
Python
Install
pip install sqlalchemy
pip install sqlalchemy[asyncio]
pip install psycopg2-binary

Two modes: Core (SQL expression language) and ORM (identity maps, unit of work, sessions).

The Session tracks objects, manages transactions, and flushes changes.

2.0 style: select() instead of session.query(), native async support, improved type hints.

Setup

EngineCreate database engine.
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@localhost/db')

ORM Models

Declarative baseBase for models.
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
    pass
Define modelORM model with columns.
from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    email = Column(String(255), unique=True)

Session & Queries

ORM INSERTCreate with Session.
with Session(engine) as session:
    user = User(name='Alice', email='alice@example.com')
    session.add(user)
    session.commit()
ORM SELECT2.0 style query.
from sqlalchemy import select
stmt = select(User).where(User.name == 'Alice')
user = session.scalar(stmt)
users = session.scalars(select(User)).all()
ORM UPDATEUpdate record.
user = session.get(User, 1)
user.name = 'Updated'
session.commit()
ORM DELETERemove record.
user = session.get(User, 1)
session.delete(user)
session.commit()

Relationships

RelationshipOne-to-many.
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True)
    author_id = Column(ForeignKey('users.id'))
    author = relationship('User', back_populates='posts')
User.posts = relationship('Post', back_populates='author')
Eager loadingLoad relations in one query.
from sqlalchemy.orm import joinedload
stmt = select(User).options(joinedload(User.posts))
user = session.scalar(stmt)  # user.posts pre-populated

Migrations (Alembic)

Alembic setupDatabase migrations.
pip install alembic
alembic init alembic
alembic revision --autogenerate -m "initial"
alembic upgrade head