# QC Élection Forecast — Plateforme de prévision électorale du Québec 2026 # Auteur : Simon-Pierre Boucher # Contact : contact@spboucher.ai # https://www.qc-election.com from __future__ import annotations from sqlalchemy import create_engine from sqlalchemy.orm import DeclarativeBase, Session, sessionmaker from .config import settings class Base(DeclarativeBase): pass engine = create_engine( settings.database_url, connect_args={"check_same_thread": False} if settings.database_url.startswith("sqlite") else {}, ) SessionLocal = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False) def get_db(): db: Session = SessionLocal() try: yield db finally: db.close() def init_db() -> None: from . import models # noqa: F401 Base.metadata.create_all(engine) _migrate() def _migrate() -> None: """Micro-migrations SQLite : create_all n'ALTÈRE pas les tables existantes — on ajoute ici les colonnes manquantes (idempotent, additif seulement).""" from sqlalchemy import inspect, text added = { "social_posts": [("content_class", "VARCHAR(20) DEFAULT 'public_discussion'")], } insp = inspect(engine) with engine.begin() as conn: for table, cols in added.items(): if table not in insp.get_table_names(): continue existing = {c["name"] for c in insp.get_columns(table)} for name, ddl in cols: if name not in existing: conn.execute(text( f"ALTER TABLE {table} ADD COLUMN {name} {ddl}"))