File size: 1,615 Bytes
b666236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
Configuration de la connexion à la base de données PostgreSQL.
Utilise SQLAlchemy comme ORM et lit l'URL depuis le fichier .env.

Si DATABASE_URL n'est pas définie (ex: conteneur Docker sans PostgreSQL),
le module ne génère pas d'erreur. Les fonctions de logging détecteront
l'absence de DB et fonctionneront en mode dégradé.
"""

import logging
import os

from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, sessionmaker

logger = logging.getLogger(__name__)

# Charge les variables d'environnement depuis le fichier .env
load_dotenv()

# URL de connexion à la base de données
DATABASE_URL = os.getenv("DATABASE_URL")

if DATABASE_URL is None:
    logger.warning(
        "DATABASE_URL n'est pas définie. "
        "La base de données ne sera pas disponible. "
        "L'API fonctionnera sans logging en base de données."
    )
    engine = None
    SessionLocal = None
else:
    # Engine SQLAlchemy = connexion vers PostgreSQL
    engine = create_engine(DATABASE_URL)
    # SessionLocal = fabrique de sessions (une session = une transaction DB)
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


# Base = classe de base pour tous les modèles ORM
class Base(DeclarativeBase):
    pass


def get_db():
    """
    Générateur qui fournit une session de base de données.

    Yields:
        Session SQLAlchemy ou None si la DB n'est pas configurée
    """
    if SessionLocal is None:
        yield None
        return

    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()