⚖️ Старый vs Новый: Query API 1.x (лекция) и select() 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.