SPB Git forge

spb/qc-election

Public
20commits 1branches 0releases
4.9 MBsize
maindefault branch
20 days agolast push
Python 66.6% HTML 24.8% CSS 4.9% JavaScript 3.6%
1.6 KB · 55 lines python
Raw Blame History
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