# export_campanias.py — Exporta TODA la tabla campanias de Supabase a Excel/CSV. # Ejecutar dentro de backend/: python export_campanias.py import os, csv, requests from dotenv import load_dotenv load_dotenv() URL = os.getenv("CARTERA_URL") or os.getenv("SUPABASE_PAUTA_URL", "") KEY = os.getenv("CARTERA_KEY") or os.getenv("SUPABASE_PAUTA_KEY", "") TABLA = os.getenv("SUPABASE_TABLA_CAMPANIAS", "campanias") HEAD = {"apikey": KEY, "Authorization": f"Bearer {KEY}"} assert URL and KEY, "Falta CARTERA_URL / CARTERA_KEY en .env" def traer_todo(): filas, paso, desde = [], 1000, 0 while True: hdr = dict(HEAD) hdr["Range-Unit"] = "items" hdr["Range"] = f"{desde}-{desde + paso - 1}" r = requests.get(f"{URL}/rest/v1/{TABLA}", params={"select": "*"}, headers=hdr, timeout=60) r.raise_for_status() data = r.json() if not data: break filas.extend(data) print(f" descargadas: {len(filas)}", end="\r") desde += len(data) # avanzar por lo realmente recibido if len(data) < paso: break print() return filas print(f"Descargando '{TABLA}' de Supabase...") filas = traer_todo() print(f"Total: {len(filas)} filas") if not filas: print("Sin datos. Revisa CARTERA_URL / CARTERA_KEY en .env") raise SystemExit # columnas = union de todas las claves, en orden de la primera fila cols = list(filas[0].keys()) for f in filas: for k in f.keys(): if k not in cols: cols.append(k) # 1) CSV siempre csv_path = "campanias_export.csv" with open(csv_path, "w", newline="", encoding="utf-8-sig") as fout: w = csv.DictWriter(fout, fieldnames=cols) w.writeheader() for f in filas: w.writerow({c: f.get(c, "") for c in cols}) print(f"CSV generado: {csv_path}") # 2) Excel si openpyxl esta disponible try: from openpyxl import Workbook wb = Workbook(); ws = wb.active; ws.title = "campanias" ws.append(cols) for f in filas: ws.append([f.get(c, "") for c in cols]) xlsx_path = "campanias_export.xlsx" wb.save(xlsx_path) print(f"Excel generado: {xlsx_path}") except ImportError: print("(openpyxl no instalado -> solo CSV. Para Excel: pip install openpyxl)")