| name | query-patterns |
| description | Use when the user asks about "SQLAlchemy queries", "filter records", "SQLAlchemy select", "join tables", "aggregate query", "order by", "pagination", "N+1 query problem", "eager loading", "SQLAlchemy session", or needs patterns for querying data with SQLAlchemy.
|
SQLAlchemy Query Patterns
Production patterns for querying, filtering, and optimizing database access with SQLAlchemy 2.0+.
Basic Queries (Flask-SQLAlchemy)
users = User.query.all()
user = db.session.get(User, 1)
active_clients = Client.query.filter_by(status='vip').all()
client = Client.query.filter_by(email='test@example.com').first()
client = Client.query.get_or_404(client_id)
SQLAlchemy 2.0 Select Style
from sqlalchemy import select
stmt = select(User).where(User.email == 'test@example.com')
user = db.session.execute(stmt).scalar_one_or_none()
stmt = select(Client).where(Client.user_id == current_user.id)
clients = db.session.execute(stmt).scalars().all()
Filtering
Client.query.filter_by(status='vip')
Client.query.filter(Client.status == 'vip')
Client.query.filter(Client.status != 'cancelled')
Client.query.filter(Client.name.like('%anna%'))
Client.query.filter(Client.name.ilike(f'%{search_term}%'))
Client.query.filter(Client.status.in_(['vip', 'regular']))
Client.query.filter(Client.birthday.is_(None))
Client.query.filter(Client.birthday.isnot(None))
from datetime import date
Appointment.query.filter(
Appointment.date >= date(2026, 3, 1),
Appointment.date <= date(2026, 3, 31)
)
Appointment.query.filter(
Appointment.user_id == user_id,
Appointment.date == today,
Appointment.status == 'on plan'
)
from sqlalchemy import or_
Client.query.filter(or_(
Client.status == 'vip',
Client.status == 'regular'
))
Ordering
Client.query.order_by(Client.name)
Appointment.query.order_by(Appointment.date.desc(), Appointment.time.desc())
Client.query.order_by(Client.status, Client.name)
Aggregation
from sqlalchemy import func
count = Client.query.filter_by(user_id=user_id).count()
total = db.session.query(func.sum(Spending.amount)).filter_by(
user_id=user_id
).scalar() or 0
avg_price = db.session.query(func.avg(Appointment.price)).scalar()
spending_by_category = db.session.query(
Spending.category,
func.sum(Spending.amount).label('total')
).filter_by(user_id=user_id).group_by(Spending.category).all()
Joins
appointments = Appointment.query.filter_by(user_id=user_id).all()
for appt in appointments:
print(appt.client.name)
results = db.session.query(Appointment, Client).join(
Client, Appointment.client_id == Client.id
).filter(Appointment.date == today).all()
results = db.session.query(Client).outerjoin(Appointment).all()
Eager Loading (Avoid N+1)
from sqlalchemy.orm import joinedload, selectinload
appointments = Appointment.query.options(
joinedload(Appointment.client)
).filter_by(user_id=user_id).all()
clients = Client.query.options(
selectinload(Client.appointments)
).filter_by(user_id=user_id).all()
Pagination
page = request.args.get('page', 1, type=int)
pagination = Client.query.filter_by(user_id=user_id).paginate(
page=page, per_page=20, error_out=False
)
clients = pagination.items
Session Operations (CRUD)
client = Client(name='Anna', phone='+380501234567', user_id=user_id)
db.session.add(client)
db.session.commit()
client.status = 'vip'
db.session.commit()
db.session.delete(client)
db.session.commit()
db.session.add_all([client1, client2, client3])
db.session.commit()
try:
db.session.add(client)
db.session.commit()
except Exception:
db.session.rollback()
raise
Subqueries
subq = db.session.query(Appointment.client_id).filter(
Appointment.status == 'done'
).distinct().subquery()
active_clients = Client.query.filter(Client.id.in_(select(subq))).all()