0Pricing
Python Academy · Lekcja

Asynchroniczne endpointy i integracja z bazą danych

Proszę pisać asynchroniczne handlery tras i łączyć się z bazą danych za pomocą SQLAlchemy.

Asynchroniczne endpointy i integracja z bazą danych to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Endpointy async def

Procedury obsługi tras należy deklarować za pomocą async def, aby wykonywać nieblokujące operacje wejścia-wyjścia. def należy stosować w przypadku operacji intensywnie obciążających procesor lub blokujących, ponieważ FastAPI uruchamia je w puli wątków.

from fastapi import FastAPI
import asyncio
app = FastAPI()

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

asyncpg dla PostgreSQL

asyncpg to szybki, asynchroniczny sterownik PostgreSQL. Należy używać puli połączeń współdzielonej między żądaniami.

# 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

Asynchroniczny SQLAlchemy

SQLAlchemy 1.4+ wraz z async_sessionmaker zapewnia asynchroniczny ORM. AsyncSession należy stosować jako zależność 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

Zależność bazy danych

Sesję należy zwracać za pomocą yield z zależności FastAPI, aby po zakończeniu żądania została zatwierdzona i zamknięta.

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()

Modele ORM SQLAlchemy

Modele ORM należy definiować za pomocą DeclarativeBase i mapować je na tabele bazy danych.

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]

Operacje CRUD

Należy zaimplementować podstawowe operacje tworzenia, odczytu, aktualizacji i usuwania za pomocą metod asynchronicznej sesji 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 do migracji

Alembic należy stosować do zarządzania migracjami schematu bazy danych w sposób umożliwiający kontrolę wersji.

# 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 do asynchronicznych wywołań HTTP

httpx.AsyncClient należy stosować do wywoływania zewnętrznych interfejsów API z asynchronicznych endpointów 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()

Zadania w tle

BackgroundTasks należy stosować do wykonywania operacji po wysłaniu odpowiedzi — na przykład wysłania wiadomości e-mail lub zaktualizowania pamięci podręcznej.

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"}

Zdarzenia cyklu życia

Menedżera kontekstu lifespan (FastAPI 0.93+) należy używać do uruchamiania kodu startowego i kończącego działanie — na przykład do tworzenia puli połączeń z bazą danych.

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)

Testowanie FastAPI za pomocą httpx

httpx.AsyncClient wraz z ASGITransport należy stosować do testowania endpointów FastAPI bez uruchamiania serwera.

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}

Szybkie sprawdzenie

Kiedy należy używać async def, a kiedy def w procedurze obsługi trasy FastAPI?

Podsumowanie

Należy używać endpointów async def wraz z asynchronicznymi sterownikami baz danych (asyncpg, SQLAlchemy async). Sesją bazy danych należy zarządzać jako zależnością FastAPI. BackgroundTasks służy do pracy wykonywanej po wysłaniu odpowiedzi, a menedżer kontekstu lifespan — do obsługi uruchamiania i zamykania aplikacji.

Często zadawane pytania

Czy lekcja „Asynchroniczne endpointy i integracja z bazą danych” jest bezpłatna?

Tak — pełny tekst „Asynchroniczne endpointy i integracja z bazą danych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Asynchroniczne endpointy i integracja z bazą danych”?

Proszę pisać asynchroniczne handlery tras i łączyć się z bazą danych za pomocą SQLAlchemy. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Asynchroniczne endpointy i integracja z bazą danych”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Konfiguracja projektu FastAPI i pierwszy endpoint
  2. Parametry ścieżki, parametry zapytania i treści żądań
  3. Wstrzykiwanie zależności i uwierzytelnianie
  4. Asynchroniczne endpointy i integracja z bazą danych
← Powrót do Python Academy