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
- Installez les dépendances :
pip install -r requirements.txt - Implémentez
database.py: engine SQLite + sessionmaker + get_db() - Implémentez
models.py: tous les modèles avec relations - Initialisez Alembic :
alembic init alembic - Générez la migration initiale :
alembic revision --autogenerate -m "init" - Appliquez :
alembic upgrade head - Implémentez
crud.pyet 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()