Objectif

Implémenter les modèles complets du fil rouge TaskAPI avec SQLAlchemy 2.x et toutes les opérations CRUD. Ce mini-projet est la fondation des modules suivants.

Entités : User, Project, Task, Tag, Comment, table d'association task_tags. Toutes les relations bidirectionnelles avec les bonnes stratégies de chargement.

Schéma de base de données

users          projects        tasks
  id (PK)        id (PK)         id (PK)
  email          name            title
  username       owner_id (FK)   status
  password       created_at      project_id (FK)
  created_at                     assignee_id (FK)
                                 due_date
tags           task_tags       comments
  id (PK)        task_id (FK)    id (PK)
  name           tag_id (FK)     task_id (FK)
  color                          author_id (FK)
                                 content

Structure du projet

04-sqlalchemy/mini-projet/solution/
├── database.py    # Engine, SessionLocal, Base, get_db()
├── models.py      # Tous les modèles SQLAlchemy
├── crud.py        # Fonctions CRUD
└── requirements.txt

Étapes

  1. Installez les dépendances : pip install -r requirements.txt
  2. Implémentez database.py : engine SQLite + sessionmaker + get_db()
  3. Implémentez models.py : tous les modèles avec relations
  4. Initialisez Alembic : alembic init alembic
  5. Générez la migration initiale : alembic revision --autogenerate -m "init"
  6. Appliquez : alembic upgrade head
  7. Implémentez crud.py et testez avec un script de seed

Test rapide

from database import SessionLocal, engine, Base
from models import User, Project, Task
from crud import create_task, get_project_stats

# Créer les tables (dev uniquement)
Base.metadata.create_all(bind=engine)

db = SessionLocal()
try:
    # Créer un utilisateur
    user = User(email="test@test.com", username="test", hashed_password="x")
    db.add(user)
    db.flush()

    # Créer un projet
    project = Project(name="Test Project", owner_id=user.id)
    db.add(project)
    db.flush()

    # Créer des tâches
    for i in range(3):
        create_task(db, f"Tâche {i+1}", project.id, user.id)

    # Stats
    stats = get_project_stats(db, project.id)
    print(stats)  # {"total_tasks": 3, "done_tasks": 0, ...}
finally:
    db.close()
← Retour au cours 🧠 QCM Module 04 Module 05 — API REST →