Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 210новых вакансий за сутки·93 612вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 126
  • Облачные технологии14 079
  • QA вакансии3 451
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 260

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии986
  • AI вакансии950
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

DevOps и инфраструктура

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 488
  • Terraform / IaC4 272
  • CI/CD3 239
  • Мониторинг и Observability1 789
  • SRE567
  • Кибербезопасность452

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик923
  • Аналитик данных855
  • Системный аналитик152

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 276
  • Вакансии в Европе23 819
  • Вакансии в Канаде4 471
  • Работа в России3 904

По формату

  • Удалённые вакансии74 928
  • Релокация в США44 273
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме SQLAlchemyВсе вопросы
SQLAlchemyMiddleТеория

В чём разница между expire_on_commit=True и expire_on_commit=False?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

expire_on_commit=True (по умолчанию) помечает объекты expired после commit — следующее чтение атрибута делает SELECT. False оставляет данные в памяти, но нужен явный refresh() для серверных значений.

expire_on_commit=True (по умолчанию)

После каждого commit() SQLAlchemy помечает все persistent-объекты как expired. При следующем обращении к любому атрибуту объекта автоматически выполняется SELECT для обновления значений из БД.

from sqlalchemy.orm import Session

# expire_on_commit=True — поведение по умолчанию
with Session(engine) as session:
    user = User(name="Alice")
    session.add(user)
    session.commit()
    # Здесь user — expired. Следующая строка вызовет SELECT:
    print(user.name)  # SELECT users WHERE id=1 → 'Alice'

Это гарантирует, что вы всегда читаете актуальные данные из БД (включая server_default, триггеры, generated columns).

expire_on_commit — поведение объектов после коммита

Параметр expire_on_commit управляет тем, что происходит с ORM-объектами в сессии сразу после успешного session.commit().

expire_on_commit=False

Объекты не помечаются как expired после commit. Атрибуты остаются в памяти Python — SELECT не происходит при следующем обращении.

from sqlalchemy.orm import sessionmaker

SessionLocal = sessionmaker(engine, expire_on_commit=False)

with SessionLocal() as session:
    user = User(name="Bob")
    session.add(user)
    session.commit()
    # Нет lazy SELECT — читаем из памяти:
    print(user.name)  # 'Bob', без запроса к БД
    print(user.id)    # id заполнен после flush (не пустой)

Когда использовать каждый вариант

  • True — когда важна консистентность: trigrры в БД, server_default (created_at, uuid), конкурентные обновления.
  • False — async-код с FastAPI/asyncpg, где лишние SELECT после commit создают проблемы; возврат объекта из эндпоинта сразу после создания без дополнительного refresh().
# Типичный FastAPI паттерн с async:
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker

AsyncSessionLocal = async_sessionmaker(
    async_engine,
    expire_on_commit=False  # избегаем lazy SELECT вне async context
)

async def create_user(data: UserCreate) -> User:
    async with AsyncSessionLocal() as session:
        user = User(**data.model_dump())
        session.add(user)
        await session.commit()
        await session.refresh(user)  # явно получаем id и server defaults
        return user

Разница в поведении при detach

# expire_on_commit=True:
with Session(engine) as session:
    user = session.get(User, 1)
    session.commit()  # user теперь expired
# После выхода из контекста — detached:
# user.name  →  DetachedInstanceError (нельзя lazy load)

# expire_on_commit=False:
with SessionLocal() as session:  # expire_on_commit=False
    user = session.get(User, 1)
    session.commit()  # user НЕ expired, данные в памяти
# После выхода:
print(user.name)  # OK — читаем из памяти без SELECT

Подводные камни

  • С expire_on_commit=True обращение к атрибуту вне сессии (detached state) бросает DetachedInstanceError — частая ошибка при сериализации Pydantic-схем после commit.
  • С expire_on_commit=False вы можете прочитать устаревшие данные: если между двумя коммитами другая транзакция обновила строку, ваш объект этого не знает.
  • В async-коде expire_on_commit=True + lazy attribute access вне async with session даёт MissingGreenlet вместо понятной ошибки.
  • session.refresh(obj) всегда делает SELECT независимо от expire_on_commit — используйте его явно, когда нужны актуальные значения server defaults.
  • Настройка применяется на уровне sessionmaker, не на уровне отдельного запроса — изменение поведения для одного коммита требует явного session.expire(obj) или session.refresh(obj).
  • При использовании scoped_session в многопоточном коде expire_on_commit=False увеличивает риск чтения stale data между запросами.
  • Комбинация expire_on_commit=True + возврат объекта из функции после закрытия сессии — самая частая причина DetachedInstanceError в production.

Типичные ошибки

  • Описывать expire on commit только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом SQLAlchemy и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет expire on commit через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме SQLAlchemy →

Источники

  • https://docs.sqlalchemy.org/en/20/orm/session_basics.html
←Предыдущий вопросПредставьте, после изменения кода на SQLAlchemy выросло число SQL-запросов и latency. Как вы будете это доказывать и чинить?Следующий вопрос→В чём разница между `Session.add()`, `Session.merge()` и `Session.get()`?

Связанные темы

SQLAlchemydatabase-designtechnical-reasoning

Вакансии с этим навыком

  • Python developer

Частые вопросы на собеседовании

  • Как решить проблему N+1 запросов в SQLAlchemy с помощью selectinload или joinedload?
  • Как работает Session в SQLAlchemy и что такое паттерн Unit of Work?
  • Как делать zero-downtime миграции с Alembic и SQLAlchemy models?
  • Что такое Engine в SQLAlchemy и как работает пул соединений?