first commit
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
from App import *
|
||||
from requests import *
|
||||
|
||||
|
||||
pg_config = PGConfig()
|
||||
database = DatabaseManager(config.database, config.databaseID)
|
||||
run_etl(config, database, data_report)
|
||||
|
||||
|
||||
|
||||
pg_config = PGConfig()
|
||||
|
||||
|
||||
|
||||
projects = {'PG':pg_config,
|
||||
#'Feduro':feduroConfig,
|
||||
#'Cimberton':cimbertonConfig}
|
||||
}
|
||||
|
||||
|
||||
print(projects)
|
||||
for project, config in projects.items():
|
||||
print(f"Iniciando servicio ETL para el proyecto {project} y {config}")
|
||||
report_list = config.reportsID
|
||||
run_etl(project, config, report_list=report_list)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
import time
|
||||
import importlib
|
||||
import pyodbc
|
||||
from datetime import datetime
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
|
||||
# 🔌 conexión a SQL Server
|
||||
CONN_STR = """
|
||||
DRIVER={ODBC Driver 18 for SQL Server};
|
||||
SERVER=sql.glmanalytics.com;
|
||||
DATABASE=glm_pg;
|
||||
UID=vmglm001;
|
||||
PWD=tu_password;
|
||||
Encrypt=yes;
|
||||
TrustServerCertificate=yes;
|
||||
"""
|
||||
|
||||
# 📥 cargar configuración desde BD
|
||||
def get_clients_config():
|
||||
conn = pyodbc.connect(CONN_STR)
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute("""
|
||||
SELECT DISTINCT client_name, frequency_minutes
|
||||
FROM etl_report_config
|
||||
WHERE is_active = 1
|
||||
""")
|
||||
|
||||
rows = cursor.fetchall()
|
||||
conn.close()
|
||||
|
||||
configs = []
|
||||
for row in rows:
|
||||
configs.append({
|
||||
"client": row[0],
|
||||
"frequency": row[1]
|
||||
})
|
||||
|
||||
return configs
|
||||
|
||||
|
||||
# 📦 cargar config desde carpeta /config
|
||||
def load_client_config(client_name):
|
||||
try:
|
||||
module = importlib.import_module(f"config.{client_name}")
|
||||
return module.CONFIG
|
||||
except Exception as e:
|
||||
raise Exception(f"No se pudo cargar config de {client_name}: {e}")
|
||||
|
||||
|
||||
# ⚙️ lógica ETL por cliente
|
||||
def run_etl(client_name):
|
||||
try:
|
||||
print(f"\n[{datetime.now()}] 🚀 Iniciando ETL para {client_name}")
|
||||
|
||||
config = load_client_config(client_name)
|
||||
|
||||
# 🔥 aquí usas tu config
|
||||
connection = config.get("connection")
|
||||
tables = config.get("tables", [])
|
||||
|
||||
print(f"Tablas a procesar: {tables}")
|
||||
|
||||
# 👉 ejemplo de flujo
|
||||
for table in tables:
|
||||
print(f"Procesando {client_name} - {table}")
|
||||
# extract()
|
||||
# transform()
|
||||
# load()
|
||||
|
||||
print(f"[{datetime.now()}] ✅ ETL finalizado {client_name}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"[ERROR] ❌ {client_name}: {e}")
|
||||
|
||||
|
||||
# 🧠 job que ejecuta el scheduler
|
||||
def job(client_name):
|
||||
run_etl(client_name)
|
||||
|
||||
|
||||
# 🚀 iniciar scheduler
|
||||
def start_scheduler():
|
||||
scheduler = BackgroundScheduler()
|
||||
|
||||
configs = get_clients_config()
|
||||
|
||||
for config in configs:
|
||||
client = config["client"]
|
||||
frequency = config["frequency"]
|
||||
|
||||
scheduler.add_job(
|
||||
job,
|
||||
'interval',
|
||||
minutes=frequency,
|
||||
args=[client],
|
||||
id=f"job_{client}",
|
||||
replace_existing=True
|
||||
)
|
||||
|
||||
print(f"✅ Job registrado: {client} cada {frequency} minutos")
|
||||
|
||||
scheduler.start()
|
||||
print("\n🚀 Scheduler iniciado correctamente\n")
|
||||
|
||||
# mantener vivo (IMPORTANTE en Docker)
|
||||
try:
|
||||
while True:
|
||||
time.sleep(60)
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
scheduler.shutdown()
|
||||
|
||||
|
||||
# ▶️ entrypoint
|
||||
if __name__ == "__main__":
|
||||
start_scheduler()
|
||||
Reference in New Issue
Block a user