ValorSentimental / backend /scripts /limpiar_bdm.py
iagofp's picture
Diagramas
d639ab2
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import sqlite3
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from base_datos import iniciar_historial_usuario
from config import HISTORY_DB_PATH
def _obtener_tablas(conn: sqlite3.Connection) -> list[str]:
rows = conn.execute(
"SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name"
).fetchall()
return [str(r[0]) for r in rows]
def limpiar_datos(db_path: Path) -> dict[str, int]:
if not db_path.exists():
iniciar_historial_usuario()
deleted_by_table: dict[str, int] = {}
with sqlite3.connect(db_path) as conn:
conn.execute("PRAGMA foreign_keys = OFF")
tables = _obtener_tablas(conn)
for table_name in tables:
cur = conn.execute(f"DELETE FROM {table_name}")
deleted_by_table[table_name] = int(cur.rowcount or 0)
all_tables = {r[0] for r in conn.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall()}
if "sqlite_sequence" in all_tables:
conn.execute("DELETE FROM sqlite_sequence")
conn.commit()
return deleted_by_table
def main() -> int:
parser = argparse.ArgumentParser(description="Elimina todos los datos de la BDM (SQLite) del proyecto.")
parser.add_argument(
"--db-path",
type=Path,
default=HISTORY_DB_PATH,
help=f"Ruta de la base de datos (por defecto: {HISTORY_DB_PATH})",
)
args = parser.parse_args()
db_path = args.db_path.resolve()
deleted_by_table = limpiar_datos(db_path)
total = sum(deleted_by_table.values())
print(f"BD limpiada: {db_path}")
for table_name, count in deleted_by_table.items():
print(f" {table_name}: {count} filas eliminadas")
print(f"Total eliminado: {total} filas")
iniciar_historial_usuario()
print("Esquema verificado (tablas e índices recreados si faltaban).")
return 0
if __name__ == "__main__":
raise SystemExit(main())