Endpoints asynchrones et intégration à une base de données
Écrivez des gestionnaires de routes asynchrones et connectez-vous à une base de données avec SQLAlchemy.
Endpoints asynchrones et intégration à une base de données est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Points de terminaison avec async def
Déclarez les gestionnaires de routes avec async def pour les opérations d'E/S non bloquantes. Utilisez def pour les opérations limitées par le CPU ou bloquantes (FastAPI les exécute dans un pool de threads).
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/slow")
async def slow():
await asyncio.sleep(1) # non-blocking
return {"done": True}asyncpg pour PostgreSQL
asyncpg est un pilote PostgreSQL asynchrone et rapide. Utilisez un pool de connexions partagé entre les requêtes.
# 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 rowsSQLAlchemy asynchrone
SQLAlchemy 1.4+ avec async_sessionmaker fournit un ORM asynchrone. Utilisez AsyncSession comme dépendance 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 sessionDépendance de base de données
Faites produire la session par une dépendance FastAPI afin qu'elle soit validée puis fermée après la requête.
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()Modèles ORM SQLAlchemy
Définissez les modèles ORM avec DeclarativeBase et associez-les aux tables de la base de données.
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]Opérations CRUD
Implémentez les opérations de création, lecture, mise à jour et suppression à l'aide des méthodes de session asynchrone de 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 pour les migrations
Utilisez Alembic pour gérer les migrations du schéma de la base de données de manière versionnée.
# 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 pour les appels HTTP asynchrones
Utilisez httpx.AsyncClient pour appeler des interfaces de programmation externes depuis des points de terminaison FastAPI asynchrones.
# 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()Tâches en arrière-plan
Utilisez BackgroundTasks pour exécuter des tâches après l'envoi de la réponse — par exemple, envoyer un e-mail ou mettre à jour un cache.
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"}Événements du cycle de vie
Utilisez le gestionnaire de contexte lifespan (FastAPI 0.93+) pour exécuter le code de démarrage et d'arrêt — par exemple, créer le pool de connexions à la base de données.
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)Tester FastAPI avec httpx
Utilisez httpx.AsyncClient avec ASGITransport pour tester les points de terminaison FastAPI sans démarrer de serveur.
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}Vérification rapide
Quand devez-vous utiliser async def plutôt que def pour le gestionnaire d'une route FastAPI ?
Récapitulatif
Utilisez des points de terminaison async def avec des pilotes de base de données asynchrones (asyncpg, SQLAlchemy asynchrone). Gérez la session de base de données comme une dépendance FastAPI. Utilisez BackgroundTasks pour les tâches à effectuer après la réponse et le gestionnaire de contexte lifespan pour le démarrage et l'arrêt.
Questions Fréquemment Posées
La leçon « Endpoints asynchrones et intégration à une base de données » est-elle gratuite ?
Oui — le texte complet de « Endpoints asynchrones et intégration à une base de données » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Endpoints asynchrones et intégration à une base de données » ?
Écrivez des gestionnaires de routes asynchrones et connectez-vous à une base de données avec SQLAlchemy. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Endpoints asynchrones et intégration à une base de données » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Configuration d’un projet FastAPI et premier endpoint
- Paramètres de chemin, paramètres de requête et corps des requêtes
- Injection de dépendances et authentification
- Endpoints asynchrones et intégration à une base de données