spb/qc-election
Public
Python 66.6%
HTML 24.8%
CSS 4.9%
JavaScript 3.6%
1# QC Élection Forecast — Plateforme de prévision électorale du Québec 20262# Auteur : Simon-Pierre Boucher3# Contact : contact@spboucher.ai4# https://www.qc-election.com5from __future__ import annotations67from sqlalchemy import create_engine8from sqlalchemy.orm import DeclarativeBase, Session, sessionmaker910from .config import settings111213class Base(DeclarativeBase):14 pass151617engine = create_engine(18 settings.database_url,19 connect_args={"check_same_thread": False} if settings.database_url.startswith("sqlite") else {},20)21SessionLocal = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False)222324def get_db():25 db: Session = SessionLocal()26 try:27 yield db28 finally:29 db.close()303132def init_db() -> None:33 from . import models # noqa: F40134 Base.metadata.create_all(engine)35 _migrate()363738def _migrate() -> None:39 """Micro-migrations SQLite : create_all n'ALTÈRE pas les tables existantes —40 on ajoute ici les colonnes manquantes (idempotent, additif seulement)."""41 from sqlalchemy import inspect, text42 added = {43 "social_posts": [("content_class", "VARCHAR(20) DEFAULT 'public_discussion'")],44 }45 insp = inspect(engine)46 with engine.begin() as conn:47 for table, cols in added.items():48 if table not in insp.get_table_names():49 continue50 existing = {c["name"] for c in insp.get_columns(table)}51 for name, ddl in cols:52 if name not in existing:53 conn.execute(text(54 f"ALTER TABLE {table} ADD COLUMN {name} {ddl}"))55