Files
ipwatch/backend/app/core/database.py
2026-02-07 16:57:37 +01:00

102 lines
2.8 KiB
Python
Executable File

"""
Configuration de la base de données SQLAlchemy
"""
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from pathlib import Path
# Base pour les modèles SQLAlchemy (DB principale)
Base = declarative_base()
# Base dédiée à l'architecture
ArchBase = declarative_base()
# Engine et session
engine = None
SessionLocal = None
arch_engine = None
ArchSessionLocal = None
def init_database(db_path: str = "./data/db.sqlite"):
"""Initialise la connexion à la base de données"""
global engine, SessionLocal
# Créer le dossier data si nécessaire
Path(db_path).parent.mkdir(parents=True, exist_ok=True)
# Créer l'engine SQLite
database_url = f"sqlite:///{db_path}"
engine = create_engine(
database_url,
connect_args={"check_same_thread": False},
echo=False
)
# Créer la session factory
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Créer les tables
Base.metadata.create_all(bind=engine)
# Migration : ajouter les colonnes manquantes
_run_migrations(engine)
return engine
def _run_migrations(eng):
"""Ajoute les colonnes manquantes aux tables existantes"""
import sqlalchemy
inspector = sqlalchemy.inspect(eng)
# Migration de la table 'ip'
if 'ip' in inspector.get_table_names():
existing_columns = {col['name'] for col in inspector.get_columns('ip')}
with eng.connect() as conn:
if 'dhcp_synced' not in existing_columns:
conn.execute(sqlalchemy.text("ALTER TABLE ip ADD COLUMN dhcp_synced BOOLEAN DEFAULT 0"))
conn.commit()
print("✓ Migration: colonne dhcp_synced ajoutée à la table ip")
def init_architecture_database(db_path: str = "./architecture/database/architecture.sqlite"):
"""Initialise la connexion à la base de données d'architecture"""
global arch_engine, ArchSessionLocal
Path(db_path).parent.mkdir(parents=True, exist_ok=True)
database_url = f"sqlite:///{db_path}"
arch_engine = create_engine(
database_url,
connect_args={"check_same_thread": False},
echo=False
)
ArchSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=arch_engine)
# Créer les tables d'architecture si besoin
ArchBase.metadata.create_all(bind=arch_engine)
return arch_engine
def get_db():
"""Dependency pour obtenir une session DB"""
db = SessionLocal()
try:
yield db
finally:
db.close()
def get_arch_db():
"""Dependency pour obtenir une session DB architecture"""
if ArchSessionLocal is None:
init_architecture_database()
db = ArchSessionLocal()
try:
yield db
finally:
db.close()