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 rowsAsynchroniczny 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 sessionZależ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 headhttpx 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
- Konfiguracja projektu FastAPI i pierwszy endpoint
- Parametry ścieżki, parametry zapytania i treści żądań
- Wstrzykiwanie zależności i uwierzytelnianie
- Asynchroniczne endpointy i integracja z bazą danych