giragroup-bi-backend / migrate.py
Adzacam
feat: integrate automatic database migration execution on application startup
79c0eb4
Raw
History Blame
5.69 kB
import os
import sys
from sqlalchemy import text
from database import engine
def run_migrations():
print("Connecting to database...")
with engine.connect() as conn:
trans = conn.begin()
try:
# 1. Add estado_academico column to fact_rendimiento_academico
print("Adding column estado_academico to fact_rendimiento_academico...")
conn.execute(text("""
ALTER TABLE public.fact_rendimiento_academico
ADD COLUMN IF NOT EXISTS estado_academico VARCHAR(50);
"""))
# 2. De-duplicate fact_marketing
print("De-duplicating public.fact_marketing...")
conn.execute(text("""
DELETE FROM public.fact_marketing a USING public.fact_marketing b
WHERE a.id_hecho_mkt < b.id_hecho_mkt
AND a.id_modulo = b.id_modulo
AND a.id_tiempo = b.id_tiempo;
"""))
# Add constraint if not exists
print("Adding constraint uq_fact_marketing_modulo_tiempo...")
conn.execute(text("""
ALTER TABLE public.fact_marketing
DROP CONSTRAINT IF EXISTS unique_modulo_tiempo;
"""))
conn.execute(text("""
ALTER TABLE public.fact_marketing
DROP CONSTRAINT IF EXISTS uq_fact_marketing_modulo_tiempo;
"""))
conn.execute(text("""
ALTER TABLE public.fact_marketing
ADD CONSTRAINT uq_fact_marketing_modulo_tiempo UNIQUE (id_modulo, id_tiempo);
"""))
# 3. De-duplicate fact_rentabilidad (public.fact_rentabilidad)
print("De-duplicating public.fact_rentabilidad...")
conn.execute(text("""
DELETE FROM public.fact_rentabilidad a USING public.fact_rentabilidad b
WHERE a.id_hecho_rent < b.id_hecho_rent
AND a.id_categoria = b.id_categoria
AND a.id_tiempo = b.id_tiempo;
"""))
print("Adding constraint uq_fact_rentabilidad_categoria_tiempo...")
conn.execute(text("""
ALTER TABLE public.fact_rentabilidad
DROP CONSTRAINT IF EXISTS uq_fact_rentabilidad_categoria_tiempo;
"""))
conn.execute(text("""
ALTER TABLE public.fact_rentabilidad
ADD CONSTRAINT uq_fact_rentabilidad_categoria_tiempo UNIQUE (id_categoria, id_tiempo);
"""))
# 4. De-duplicate fact_rendimiento_academico
print("De-duplicating public.fact_rendimiento_academico...")
conn.execute(text("""
DELETE FROM public.fact_rendimiento_academico a USING public.fact_rendimiento_academico b
WHERE a.id_hecho_aca < b.id_hecho_aca
AND a.id_estudiante = b.id_estudiante
AND a.id_modulo = b.id_modulo;
"""))
print("Adding constraint uq_fact_rendimiento_estudiante_modulo...")
conn.execute(text("""
ALTER TABLE public.fact_rendimiento_academico
DROP CONSTRAINT IF EXISTS uq_fact_rendimiento_estudiante_modulo;
"""))
conn.execute(text("""
ALTER TABLE public.fact_rendimiento_academico
ADD CONSTRAINT uq_fact_rendimiento_estudiante_modulo UNIQUE (id_estudiante, id_modulo);
"""))
# 5. De-duplicate fact_situacion_financiera
print("De-duplicating public.fact_situacion_financiera...")
conn.execute(text("""
DELETE FROM public.fact_situacion_financiera a USING public.fact_situacion_financiera b
WHERE a.id_hecho_fin < b.id_hecho_fin
AND a.id_estudiante = b.id_estudiante
AND a.id_tiempo = b.id_tiempo;
"""))
print("Adding constraint uq_fact_situacion_financiera_estudiante_tiempo...")
conn.execute(text("""
ALTER TABLE public.fact_situacion_financiera
DROP CONSTRAINT IF EXISTS uq_fact_situacion_financiera_estudiante_tiempo;
"""))
conn.execute(text("""
ALTER TABLE public.fact_situacion_financiera
ADD CONSTRAINT uq_fact_situacion_financiera_estudiante_tiempo UNIQUE (id_estudiante, id_tiempo);
"""))
# 6. De-duplicate fact_cobranzas_proyectadas
print("De-duplicating public.fact_cobranzas_proyectadas...")
conn.execute(text("""
DELETE FROM public.fact_cobranzas_proyectadas a USING public.fact_cobranzas_proyectadas b
WHERE a.id_hecho_cobro < b.id_hecho_cobro
AND a.id_estudiante = b.id_estudiante
AND a.id_tiempo = b.id_tiempo;
"""))
print("Adding constraint uq_fact_cobranzas_proyectadas_estudiante_tiempo...")
conn.execute(text("""
ALTER TABLE public.fact_cobranzas_proyectadas
DROP CONSTRAINT IF EXISTS uq_fact_cobranzas_proyectadas_estudiante_tiempo;
"""))
conn.execute(text("""
ALTER TABLE public.fact_cobranzas_proyectadas
ADD CONSTRAINT uq_fact_cobranzas_proyectadas_estudiante_tiempo UNIQUE (id_estudiante, id_tiempo);
"""))
trans.commit()
print("Migrations successfully applied!")
except Exception as e:
trans.rollback()
print(f"Error during migration: {e}")
sys.exit(1)
if __name__ == "__main__":
run_migrations()