⚖️ Старый vs Новый: Query API 1.x (лекция) и select() 2.x

🎯 Лекция написана на 1.x — здесь показан переход на современный 2.x

⚡ Кратко

  • Лекция (1.x): session.query(User).all(), .filter(), .get(1)
  • Современно (2.x): session.scalars(select(User)).all(), .where(), session.get(User, 1)
  • session.query() помечен устаревшим (legacy), но пока работает в SQLAlchemy 2.x
  • В новых проектах используйте select() + session.scalars()
⚠️ Внимание: код в левой колонке — это синтаксис лекции (SQLAlchemy 1.x / legacy Query API). Правая колонка показывает современный 2.x. В реальных и новых проектах используйте 2.x.

1. Получение всех записей

🔥 Как в лекции (SQLAlchemy 1.x)

# Из лекции — устаревший Query API
users = session.query(User).all()
for user in users:
    print(user.name, user.age)

✨ Современно (SQLAlchemy 2.x)

from sqlalchemy import select

with Session(engine) as session:
    users = session.scalars(select(User)).all()
    for user in users:
        print(user.name, user.age)

2. Чтение по первичному ключу

🔥 Как в лекции (1.x)

# .get(pk) — устарел в 2.x
user = session.query(User).get(1)
print(user.name, user.age)

✨ Современно (2.x)

# session.get(Model, pk) — современный способ
user = session.get(User, 1)
if user:
    print(user.name, user.age)

3. Фильтрация — filter() vs where()

🔥 Как в лекции (1.x)

# .filter() — Query API
users = session.query(User).filter(User.age > 25).all()
for user in users:
    print(user.id, user.name, user.age)

# Несколько условий
users = session.query(User).filter(
    User.age > 20, User.age < 23
).all()

✨ Современно (2.x)

# .where() — Core select() стиль
stmt = select(User).where(User.age > 25)
users = session.scalars(stmt).all()
for user in users:
    print(user.id, user.name, user.age)

# Несколько условий
stmt = select(User).where(User.age > 20, User.age < 23)
users = session.scalars(stmt).all()
Совместимость: в SQLAlchemy 2.x метод .filter() на объекте Select — это псевдоним .where(). Они взаимозаменяемы в 2.x, но .where() — рекомендуемый стиль.

4. like(), between(), in_() — без изменений

🔥 Как в лекции (1.x)

users = session.query(User).filter(User.name.like('A%')).all()
users = session.query(User).filter(User.id.between(2, 4)).all()
users = session.query(User).filter(User.name.in_(["Alice", "Bob"])).all()

✨ Современно (2.x)

users = session.scalars(select(User).where(User.name.like('A%'))).all()
users = session.scalars(select(User).where(User.id.between(2, 4))).all()
users = session.scalars(select(User).where(User.name.in_(["Alice", "Bob"]))).all()

5. Логические условия — and_(), or_(), not_()

🔥 Как в лекции (1.x)

from sqlalchemy import and_, or_, not_

users = session.query(User).filter(
    and_(User.age > 20, User.age < 23)
).all()

users = session.query(User).filter(
    or_(User.age > 30, User.name == 'David')
).all()

users = session.query(User).filter(
    not_(User.name == 'David')
).all()

✨ Современно (2.x)

from sqlalchemy import and_, or_, not_, select

stmt = select(User).where(and_(User.age > 20, User.age < 23))
users = session.scalars(stmt).all()

stmt = select(User).where(or_(User.age > 30, User.name == 'David'))
users = session.scalars(stmt).all()

stmt = select(User).where(not_(User.name == 'David'))
users = session.scalars(stmt).all()

6. Сортировка — order_by()

🔥 Как в лекции (1.x)

from sqlalchemy import desc

# По возрастанию
users = session.query(User).order_by(User.age).all()

# По убыванию
users = session.query(User).order_by(desc(User.age)).all()

# Многоуровневая
users = session.query(User).order_by(desc(User.age), User.name).all()

✨ Современно (2.x)

from sqlalchemy import desc, select

# По возрастанию
stmt = select(User).order_by(User.age)
users = session.scalars(stmt).all()

# По убыванию
stmt = select(User).order_by(desc(User.age))
users = session.scalars(stmt).all()

# Многоуровневая
stmt = select(User).order_by(desc(User.age), User.name)
users = session.scalars(stmt).all()

Таблица отличий

Операция SQLAlchemy 1.x (как в лекции) SQLAlchemy 2.x (актуально)
Все записи session.query(User).all() session.scalars(select(User)).all()
По первичному ключу session.query(User).get(1) session.get(User, 1)
Фильтрация .filter(условие) .where(условие)
Первый результат .first() session.scalars(stmt).first()
Ровно один .one() session.scalars(stmt).one()
Сортировка .order_by(User.age) select(User).order_by(User.age)
Стиль выполнения Цепочки методов на Query select() + session.scalars()
Важно: в интернете огромное количество кода написано на SQLAlchemy 1.x с session.query(). Если вы видите такой код — это legacy API. В нашем курсе все практические примеры (examples, tasks, solutions, homework) используют SQLAlchemy 2.x.