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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 748
  • Облачные технологии6 616
  • QA вакансии2 169
  • Android1 320
  • Инженер данных872
  • Продакт-менеджер302

Разработка

  • iOS1 232
  • Backend вакансии1 204
  • AI вакансии543
  • Fullstack вакансии497
  • Frontend вакансии417
  • Mobile вакансии28

По стеку

  • Go5 212
  • Java3 116
  • Kotlin1 090
  • Node.js995
  • Rust845
  • .NET661
  • PHP320
  • C++271
  • C#208

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

  • Kubernetes3 913
  • Linux-инфраструктура2 852
  • DevOps вакансии2 678
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD923
  • SRE301
  • Кибербезопасность26

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

  • Аналитик данных533
  • Data Scientist436
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

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

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

Как интегрировать SQLAlchemy с FastAPI для работы с базой данных?

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

Создаётся async engine через create_async_engine, сессия через async_sessionmaker. Зависимость Depends(get_db) инжектирует AsyncSession в каждый запрос, транзакция коммитится или откатывается через try/finally. Модели наследуются от DeclarativeBase.

1. Настройка engine и sessionmaker

# database.py
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase

DATABASE_URL = "postgresql+asyncpg://user:pass@localhost/dbname"

engine = create_async_engine(
    DATABASE_URL,
    pool_size=10,
    max_overflow=20,
    pool_pre_ping=True,  # проверять соединение перед использованием
    echo=False,
)

AsyncSessionLocal = async_sessionmaker(
    engine,
    expire_on_commit=False,  # важно для async: объекты не перезапрашиваются
    class_=AsyncSession,
)

class Base(DeclarativeBase):
    pass

Интеграция SQLAlchemy (async) с FastAPI

FastAPI полностью поддерживает асинхронный SQLAlchemy через asyncpg (PostgreSQL) или aiosqlite (SQLite). Схема работы: один AsyncEngine на всё приложение, фабрика сессий async_sessionmaker, и dependency injection через Depends.

2. ORM-модели

# models.py
from sqlalchemy import String, Integer, ForeignKey, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from datetime import datetime
from database import Base

class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    username: Mapped[str] = mapped_column(String(50), unique=True, nullable=False)
    email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False)
    created_at: Mapped[datetime] = mapped_column(server_default=func.now())

    posts: Mapped[list["Post"]] = relationship(back_populates="author")

class Post(Base):
    __tablename__ = "posts"

    id: Mapped[int] = mapped_column(primary_key=True)
    title: Mapped[str] = mapped_column(String(200))
    user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))

    author: Mapped[User] = relationship(back_populates="posts")

3. Dependency для сессии

# deps.py
from typing import AsyncGenerator
from sqlalchemy.ext.asyncio import AsyncSession
from database import AsyncSessionLocal

async def get_db() -> AsyncGenerator[AsyncSession, None]:
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise

4. Router с CRUD-операциями

# routers/users.py
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from typing import Annotated
from deps import get_db
from models import User
from pydantic import BaseModel

router = APIRouter(prefix="/users", tags=["users"])

class UserOut(BaseModel):
    id: int
    username: str
    email: str
    model_config = {"from_attributes": True}

@router.get("/{user_id}", response_model=UserOut)
async def get_user(
    user_id: int,
    db: Annotated[AsyncSession, Depends(get_db)],
) -> User:
    user = await db.get(User, user_id)
    if not user:
        raise HTTPException(status_code=404, detail="Пользователь не найден")
    return user

@router.get("/", response_model=list[UserOut])
async def list_users(
    db: Annotated[AsyncSession, Depends(get_db)],
) -> list[User]:
    result = await db.scalars(select(User).order_by(User.id))
    return result.all()

5. Alembic для миграций

pip install alembic
alembic init alembic
# в alembic/env.py:
# from database import Base
# target_metadata = Base.metadata
alembic revision --autogenerate -m "create users"
alembic upgrade head

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

  • expire_on_commit=False обязателен в async-режиме: без него обращение к атрибутам объекта после коммита вызовет MissingGreenlet — сессия уже закрыта.
  • Lazy loading (relationship(lazy="select")) не работает в async-контексте — используйте selectinload() или joinedload() из sqlalchemy.orm.
  • db.get(User, id) использует кеш сессии (identity map) — для свежих данных из БД используйте select(User).where(User.id == id) с execution_options(populate_existing=True).
  • Один engine на приложение — не создавайте engine внутри get_db(), иначе каждый запрос будет открывать новый пул соединений.
  • При unit-тестах используйте отдельную тестовую БД и async_sessionmaker с NullPool для предотвращения утечек соединений между тестами.
  • pool_pre_ping=True добавляет SELECT 1 перед каждым использованием соединения — полезно при долгих idle-паузах, но добавляет задержку.
  • При работе с Mapped-аннотациями (SQLAlchemy 2.0) нельзя смешивать со старым стилем Column() в одной модели — выберите один подход.
  • Alembic autogenerate не видит изменения в кастомных типах (например, pgvector) — добавляйте их вручную в revision-файл.

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

  • Как FastAPI использует Pydantic-модели для валидации запросов и ответов?
  • Как реализовать аутентификацию через OAuth2 и JWT-токены в FastAPI?
  • Что такое ASGI и чем FastAPI/Uvicorn отличается от WSGI-серверов?
  • В каких backend-проектах FastAPI является сильным выбором, а где лучше выбрать более простой или другой стек?

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

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

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

  • Объясняет sqlalchemy integration через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.
  • Умеет обсудить отказ, наблюдаемость и rollback без изменения публичного контракта.

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

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

Источники

  • https://fastapi.tiangolo.com/tutorial/sql-databases/
←Предыдущий вопросКак FastAPI использует Pydantic-модели для валидации запросов и ответов?Следующий вопрос→Как реализовать аутентификацию через OAuth2 и JWT-токены в FastAPI?

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

FastAPIapi-designimplementationtechnical-reasoning

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

  • AI Engineer / Fullstack-разработчик AI-решений
  • Senior Data Engineer
  • ML / DS Engineer (Classic ML)
  • Backend Engineer
  • Senior Python-разработчик