34 lines
1.2 KiB
Python
34 lines
1.2 KiB
Python
|
|
"""
|
||
|
|
Connexion à la base de données.
|
||
|
|
|
||
|
|
La base est un simple fichier SQLite (data/stock.db) : pas de serveur de
|
||
|
|
base de données à installer ou lancer, tout vit dans ce dossier comme
|
||
|
|
demandé pour pouvoir développer et tester en local sans setup particulier.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
from sqlmodel import Session, SQLModel, create_engine
|
||
|
|
|
||
|
|
DATA_DIR = Path(__file__).resolve().parent.parent / "data"
|
||
|
|
DATA_DIR.mkdir(exist_ok=True)
|
||
|
|
DATABASE_URL = f"sqlite:///{DATA_DIR / 'stock.db'}"
|
||
|
|
|
||
|
|
# check_same_thread=False : nécessaire car FastAPI/Starlette peut exécuter
|
||
|
|
# les routes synchrones dans un thread différent du thread principal, alors
|
||
|
|
# que SQLite refuse par défaut de partager une connexion entre threads.
|
||
|
|
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
|
||
|
|
|
||
|
|
|
||
|
|
def init_db() -> None:
|
||
|
|
"""Crée les tables si elles n'existent pas encore. Appelé au démarrage
|
||
|
|
de l'app ; ne fait rien si le schéma existe déjà (pas de perte de données)."""
|
||
|
|
SQLModel.metadata.create_all(engine)
|
||
|
|
|
||
|
|
|
||
|
|
def get_session():
|
||
|
|
"""Dependency FastAPI : fournit une session DB à une route, et la ferme
|
||
|
|
proprement une fois la requête terminée."""
|
||
|
|
with Session(engine) as session:
|
||
|
|
yield session
|