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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

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

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

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

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 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