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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

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

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

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

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

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

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

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

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

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

Расскажите о случае, когда SQLAlchemy помог или помешал вам при миграциях, транзакциях, оптимизации запросов или борьбе с N+1.

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

Работал с SQLAlchemy 2.0 async: устранял N+1 через selectinload/joinedload, разрешал транзакционные гонки через with_for_update(), стабилизировал Alembic-миграции backward-compatible шагами для zero-downtime деплоя.

Миграции с Alembic

Основная боль — конфликты в alembic/versions/ при параллельных ветках. Ввёл правило: каждая миграция в отдельном PR, ревью обязательно. Настроил alembic.ini для именования файлов с датой:

file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s_%%(slug)s

Для zero-downtime деплоя разбивал изменения на backward-compatible шаги: сначала ADD COLUMN ... DEFAULT NULL, потом backfill-скрипт, потом NOT NULL constraint в отдельной миграции.

Контекст

На проекте с FastAPI + SQLAlchemy 2.0 (async) мне пришлось провести крупный рефакторинг: устранить N+1, исправить транзакционные гонки и стабилизировать Alembic-миграции при работе в команде.

Транзакции

В async SQLAlchemy 2.0 транзакции явные:

async with async_session() as session:
    async with session.begin():
        order = Order(user_id=user_id, total=total)
        session.add(order)
        await session.flush()  # получить order.id без commit
        session.add(AuditLog(order_id=order.id, event="created"))
    # commit при выходе из begin()-контекста

Столкнулся с гонкой: два параллельных запроса читали одну строку и оба её обновляли. Исправил через with_for_update():

stmt = select(Wallet).where(Wallet.user_id == uid).with_for_update()
result = await session.execute(stmt)
wallet = result.scalar_one()

N+1 запросы

Обнаружил через sqlalchemy.engine logger (уровень INFO) и sqlalchemy-utils QueryCounterMiddleware. Типичный паттерн — итерация по заказам с обращением к order.items:

# До: N+1
orders = (await session.execute(select(Order))).scalars().all()
for o in orders:
    print(o.items)  # lazy load на каждую строку

# После: joinedload
stmt = select(Order).options(joinedload(Order.items))
orders = (await session.execute(stmt)).unique().scalars().all()

Для больших коллекций предпочёл selectinload — он делает один отдельный SELECT IN вместо JOIN, избегая дублирования строк.

Оптимизация запросов

Использовал select(Order.id, Order.status) вместо select(Order) в read-only эндпоинтах — меньше трафика по сети, быстрее десериализация. Добавил индексы через Index в Alembic-миграцию:

op.create_index("ix_orders_user_id_status",
                "orders", ["user_id", "status"])

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

  • В async SQLAlchemy lazy load вызывает MissingGreenlet / greenlet_spawn исключение — все связи нужно загружать явно через selectinload / joinedload.
  • Alembic autogenerate не видит изменения в default-значениях и check-constraints без явного сравнения — всегда проверяйте сгенерированный скрипт.
  • session.flush() без commit делает изменения видимыми внутри транзакции, но не для других сессий.
  • expire_on_commit=True (дефолт) делает объекты expired после commit — обращение к атрибутам вне сессии вызывает DetachedInstanceError.
  • with_for_update() без таймаута может привести к бесконечному ожиданию; PostgreSQL поддерживает .with_for_update(nowait=True).
  • Миграции с op.execute("ALTER TABLE ... LOCK") блокируют таблицу — для больших таблиц используйте pg_repack или concurrent index creation.

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

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

Что портит ответ

  • Выдумывать опыт или говорить слишком общими фразами
  • Не объяснять свою личную роль в работе с SQLAlchemy
  • Не показывать результат, метрики или извлечённые уроки

Что слушает интервьюер

  • Может подготовить честный пример использования SQLAlchemy
  • Показывает свою роль, решения и результат
  • Умеет рефлексировать над trade-offs и уроками

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

Проверить себя по теме SQLAlchemy →
←Предыдущий вопросВ чём разница между `Session.add()`, `Session.merge()` и `Session.get()`?Следующий вопрос→Как реализовать soft deletes в SQLAlchemy?

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

SQLAlchemyexperience-storytellingtechnical-communicationtechnology-selectiontrade-off-analysis

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

  • Python developer