0Pricing
Python Academy · Урок

Асинхронные конечные точки и интеграция с базой данных

Пишите асинхронные обработчики маршрутов и подключайтесь к базе данных с помощью SQLAlchemy.

«Асинхронные конечные точки и интеграция с базой данных» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Конечные точки async def

Объявляйте обработчики маршрутов с помощью async def для неблокирующего ввода-вывода. Используйте def для операций, ограниченных CPU, или блокирующих операций: FastAPI выполняет их в пуле потоков.

from fastapi import FastAPI
import asyncio
app = FastAPI()

@app.get("/slow")
async def slow():
    await asyncio.sleep(1)   # non-blocking
    return {"done": True}

asyncpg для PostgreSQL

asyncpg — быстрый асинхронный драйвер PostgreSQL. Используйте пул соединений, общий для разных запросов.

# pip install asyncpg
import asyncpg, asyncio

async def main():
    pool = await asyncpg.create_pool("postgresql://user:pass@host/db")
    async with pool.acquire() as conn:
        rows = await conn.fetch("SELECT id, name FROM users")
    await pool.close()
    return rows

Асинхронный SQLAlchemy

SQLAlchemy 1.4+ вместе с async_sessionmaker предоставляет асинхронный ORM. Используйте AsyncSession как зависимость FastAPI.

# pip install sqlalchemy aiosqlite
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker

engine = create_async_engine("sqlite+aiosqlite:///db.sqlite")
AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False)

async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

Зависимость для базы данных

Возвращайте сессию через зависимость FastAPI, чтобы после запроса она была зафиксирована и закрыта.

from fastapi import Depends, FastAPI
from sqlalchemy.ext.asyncio import AsyncSession
app = FastAPI()

async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

@app.get("/users")
async def get_users(db: AsyncSession = Depends(get_db)):
    result = await db.execute(select(User))
    return result.scalars().all()

Модели ORM SQLAlchemy

Определяйте модели ORM с помощью DeclarativeBase и сопоставляйте их с таблицами базы данных.

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase): pass

class User(Base):
    __tablename__ = "users"

    id:    Mapped[int] = mapped_column(primary_key=True)
    name:  Mapped[str]
    email: Mapped[str]

Операции CRUD

Реализуйте базовые операции создания, чтения, обновления и удаления с помощью методов асинхронной сессии SQLAlchemy.

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

async def create_user(db: AsyncSession, name: str, email: str):
    user = User(name=name, email=email)
    db.add(user)
    await db.commit()
    await db.refresh(user)
    return user

async def get_user(db: AsyncSession, user_id: int):
    result = await db.execute(select(User).where(User.id == user_id))
    return result.scalar_one_or_none()

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

Используйте Alembic для управления миграциями схемы базы данных с контролем версий.

# pip install alembic
# alembic init alembic
# Edit alembic/env.py to point to your models

# Generate a migration:
# alembic revision --autogenerate -m "add users table"

# Apply:
# alembic upgrade head

httpx для асинхронных HTTP-вызовов

Используйте httpx.AsyncClient для вызова внешних API из асинхронных конечных точек FastAPI.

# pip install httpx
import httpx
from fastapi import FastAPI
app = FastAPI()

@app.get("/weather")
async def weather(city: str):
    async with httpx.AsyncClient() as client:
        r = await client.get(f"https://wttr.in/{city}?format=j1")
        return r.json()

Фоновые задачи

Используйте BackgroundTasks, чтобы выполнять работу после отправки ответа — например, отправлять электронное письмо или обновлять кэш.

from fastapi import FastAPI, BackgroundTasks
app = FastAPI()

def send_welcome_email(email: str):
    # blocking I/O — runs in background thread
    smtp_send(email, "Welcome!")

@app.post("/register")
def register(email: str, bg: BackgroundTasks):
    create_user(email)
    bg.add_task(send_welcome_email, email)
    return {"status": "registered"}

События жизненного цикла

Используйте менеджер контекста lifespan (FastAPI 0.93+), чтобы выполнять код запуска и завершения — например, создавать пул соединений с базой данных.

from contextlib import asynccontextmanager
from fastapi import FastAPI

@asynccontextmanager
async def lifespan(app: FastAPI):
    app.state.pool = await asyncpg.create_pool(DSN)
    yield
    await app.state.pool.close()

app = FastAPI(lifespan=lifespan)

Тестирование FastAPI с помощью httpx

Используйте httpx.AsyncClient вместе с ASGITransport, чтобы тестировать конечные точки FastAPI без запуска сервера.

import pytest, httpx
from fastapi import FastAPI
app = FastAPI()

@app.get("/ping")
async def ping(): return {"pong": True}

@pytest.mark.asyncio
async def test_ping():
    async with httpx.AsyncClient(
        transport=httpx.ASGITransport(app=app),
        base_url="http://test"
    ) as client:
        r = await client.get("/ping")
    assert r.json() == {"pong": True}

Быстрая проверка

Когда для обработчика маршрута FastAPI следует использовать async def, а когда — def?

Итоги

Используйте конечные точки async def с асинхронными драйверами баз данных (asyncpg, асинхронный SQLAlchemy). Управляйте сессией базы данных как зависимостью FastAPI. Используйте BackgroundTasks для работы после отправки ответа, а менеджер контекста lifespan — для кода запуска и завершения.

Часто задаваемые вопросы

Урок «Асинхронные конечные точки и интеграция с базой данных» бесплатный?

Да — полный текст урока «Асинхронные конечные точки и интеграция с базой данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Асинхронные конечные точки и интеграция с базой данных»?

Пишите асинхронные обработчики маршрутов и подключайтесь к базе данных с помощью SQLAlchemy. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Асинхронные конечные точки и интеграция с базой данных»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка проекта FastAPI и первая конечная точка
  2. Параметры пути, параметры запроса и тела запросов
  3. Внедрение зависимостей и аутентификация
  4. Асинхронные конечные точки и интеграция с базой данных
← Назад к Python Academy