⚖️ Старый vs Новый: SQLAlchemy 1.x → 2.x в Flask

⚡ Главные изменения

  • Model.query.all()db.session.execute(select(Model)).scalars().all()
  • Model.query.get(id)db.session.get(Model, id)
  • Model.query.filter_by(x=y).first()db.session.execute(select(M).filter_by(x=y)).scalar_one_or_none()
  • Model.query.filter(Model.x == y).all()db.session.execute(select(M).where(M.x == y)).scalars().all()
Важно: Код в лекции использует устаревший Legacy Query API (Model.query.all(), Model.query.get(id)) из SQLAlchemy 1.x / Flask-SQLAlchemy 2.x. В SQLAlchemy 2.x (Flask-SQLAlchemy 3.x) этот интерфейс устарел и будет удалён. Современный код — через db.session.execute(select(...)).

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

Из лекции (старое) Современное (SQLAlchemy 2.x)
# Legacy Query API
questions = Question.query.all()
from sqlalchemy import select
questions = db.session.execute(
    select(Question)
).scalars().all()

Почему изменилось: В SQLAlchemy 2.0 Model.query стал LegacyQuery и помечен как deprecated. select() — единственный рекомендуемый способ построения запросов.

2. Получение объекта по ID

Из лекции (старое) Современное (SQLAlchemy 2.x)
# Legacy — ищет по первичному ключу
question = Question.query.get(id)

# Уже устарело — возвращает None без предупреждения
# даже если Session кэшировал другой объект
# Явно: поиск по primary key
question = db.session.get(Question, id)
# None если не найден
# Проверяет Session Identity Map — эффективно

3. Фильтрация с .filter_by()

Из лекции (старое) Современное (SQLAlchemy 2.x)
statistic = Statistic.query.filter_by(
    question_id=question.id
).first()
from sqlalchemy import select
statistic = db.session.execute(
    select(Statistic).filter_by(
        question_id=question.id
    )
).scalar_one_or_none()

4. Фильтрация с .filter()

Из лекции (старое) Современное (SQLAlchemy 2.x)
items = Item.query.filter(
    Item.active == True
).order_by(Item.name).all()
from sqlalchemy import select
items = db.session.execute(
    select(Item)
    .where(Item.active == True)
    .order_by(Item.name)
).scalars().all()

5. Добавление и сохранение — без изменений

Операции db.session.add(), db.session.commit() и db.session.delete() не изменились — они одинаковы в обеих версиях.

# Одинаково в 1.x и 2.x
obj = Model(field=value)
db.session.add(obj)
db.session.commit()

db.session.delete(obj)
db.session.commit()

6. Сводная таблица

Операция Legacy (лекция) SQLAlchemy 2.x
Все записи Model.query.all() session.execute(select(M)).scalars().all()
По первичному ключу Model.query.get(id) session.get(Model, id)
Первый или None Model.query.filter_by(...).first() session.execute(select(M).filter_by(...)).scalar_one_or_none()
Список с условием Model.query.filter(cond).all() session.execute(select(M).where(cond)).scalars().all()
Количество Model.query.count() session.scalar(select(func.count()).select_from(M))
← К оглавлению урока