Новое: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 083
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • 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 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

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

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

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

  • Проджект-менеджер620
  • 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Все вопросы
SQLAlchemyJuniorКодинг

Как выполнять сырые SQL-запросы в SQLAlchemy, оставаясь в рамках ORM-сессии?

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

Используйте session.execute(text('SELECT ...'), {'param': value}) для сырых SQL в рамках текущей транзакции ORM-сессии. Параметры через :name защищают от инъекций; после DML нужен явный session.commit().

text() — самый простой способ

from sqlalchemy import text
from sqlalchemy.orm import Session

with Session(engine) as session:
    # Простой SELECT
    result = session.execute(
        text("SELECT id, name FROM users WHERE age > :min_age"),
        {"min_age": 18}
    )
    for row in result:
        print(row.id, row.name)

    # DML — UPDATE/INSERT/DELETE тоже через text()
    session.execute(
        text("UPDATE users SET last_login = NOW() WHERE id = :uid"),
        {"uid": 42}
    )
    session.commit()

Параметры через :name и словарь защищают от SQL-инъекций. Никогда не используйте f-строки для подстановки пользовательских данных.

Сырые SQL-запросы в рамках ORM-сессии

Иногда нужно выполнить SQL, который ORM не умеет строить — оконные функции, UPSERT, рекурсивные CTE. SQLAlchemy позволяет делать это прямо через сессию, не разрывая транзакцию.

Маппинг результатов на ORM-модели

from sqlalchemy import text

with Session(engine) as session:
    # Результат как list[User] через mappings()
    result = session.execute(
        text("SELECT * FROM users WHERE active = true")
    )
    # Преобразуем строки в dict
    rows = result.mappings().all()   # list[RowMapping]
    for row in rows:
        print(row["id"], row["name"])

connection.execute() внутри сессии

with Session(engine) as session:
    # Получить underlying connection (та же транзакция)
    conn = session.connection()
    result = conn.execute(
        text("SELECT pg_size_pretty(pg_database_size(current_database()))"
    ))
    print(result.scalar())

Async-версия

from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import text

async def bulk_update(session: AsyncSession, ids: list[int]) -> None:
    await session.execute(
        text("UPDATE jobs SET is_fresh = false WHERE id = ANY(:ids)"),
        {"ids": ids}
    )
    await session.commit()

Когда лучше использовать Core вместо text()

from sqlalchemy import insert, update
from sqlalchemy.dialects.postgresql import insert as pg_insert

# PostgreSQL UPSERT через Core (не text)
stmt = (
    pg_insert(User)
    .values(id=1, name="Alice", email="alice@example.com")
    .on_conflict_do_update(
        index_elements=["id"],
        set_={"name": "Alice Updated"}
    )
)
session.execute(stmt)

Core-выражения безопаснее, поддерживают разные диалекты и легче тестируются, чем строки.

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

  • f-строки в text(): text(f"WHERE id = {user_id}") — уязвимость SQL-инъекции. Всегда :param + словарь.
  • Транзакция и autocommit: session.execute(text(...)) работает внутри текущей транзакции. Без session.commit() DML-изменения откатятся при закрытии сессии.
  • PostgreSQL-специфичный синтаксис: ANY(:ids) с массивом работает, но тип параметра должен быть Python-list — asyncpg сам сериализует его. С psycopg2 нужен python_pq_binary_format или cast.
  • ORM-кэш и text(): после DML через text() ORM не знает о изменениях в кэше identity map — вызовите session.expire_all() если потом читаете изменённые объекты через ORM.
  • Нет автоматической защиты от типов: text() не проверяет соответствие параметров колонкам — ошибки всплывут только в runtime.

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

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

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

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

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

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

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

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

Источники

  • https://docs.sqlalchemy.org/en/20/tutorial/index.html
←Предыдущий вопросКак реализовать каскадное удаление и обновление в связях SQLAlchemy?Следующий вопрос→Какие production-риски есть у SQLAlchemy: N+1, транзакции, lazy loading, connection pooling, migrations и raw queries?

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

SQLAlchemydatabase-designimplementationtechnical-reasoning

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

  • Python developer