Spaces:
Running
Running
| """Limpeza/manutenção do banco Turso do Analytical-Force. | |
| Útil para remover dados acumulados de testes (sobretudo snapshots, que são os | |
| que mais crescem). Reaproveita a conexão do projeto (lê o .env). | |
| Uso (rodar localmente, na raiz do projeto): | |
| python scripts/clean_db.py --snapshots # apaga TODOS os snapshots | |
| python scripts/clean_db.py --date 2026-06-23 # apaga os dados desse dia | |
| python scripts/clean_db.py --all # apaga TODOS os dados | |
| python scripts/clean_db.py --date 2026-06-23 --yes # sem confirmação | |
| Tabelas afetadas: agent_runs, daily_metrics, daily_alerts, daily_reports, | |
| salesforce_snapshots. O schema (tabelas/índices) é preservado. | |
| """ | |
| from __future__ import annotations | |
| import argparse | |
| import os | |
| import sys | |
| # Permite "from src..." ao rodar o script diretamente. | |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| from src.database.turso_client import get_turso_client # noqa: E402 | |
| # Tabela -> coluna de data (para limpeza por dia). | |
| _COLUNA_DATA: dict[str, str] = { | |
| "agent_runs": "run_date", | |
| "daily_metrics": "metric_date", | |
| "daily_alerts": "alert_date", | |
| "daily_reports": "report_date", | |
| "salesforce_snapshots": "snapshot_date", | |
| } | |
| def _contar(client, tabela: str) -> int: | |
| """Conta as linhas de uma tabela (0 em caso de erro).""" | |
| try: | |
| linha = client.fetch_one(f"SELECT COUNT(*) AS n FROM {tabela}") | |
| return int(linha["n"]) if linha else 0 | |
| except Exception: | |
| return 0 | |
| def main() -> None: | |
| """Ponto de entrada do utilitário de limpeza.""" | |
| parser = argparse.ArgumentParser( | |
| description="Limpeza do banco Turso do Analytical-Force." | |
| ) | |
| parser.add_argument("--date", help="Apaga os dados de uma data (YYYY-MM-DD).") | |
| parser.add_argument( | |
| "--snapshots", action="store_true", help="Apaga TODOS os snapshots." | |
| ) | |
| parser.add_argument( | |
| "--all", action="store_true", help="Apaga TODOS os dados transacionais." | |
| ) | |
| parser.add_argument( | |
| "--yes", action="store_true", help="Não pedir confirmação." | |
| ) | |
| args = parser.parse_args() | |
| if not (args.date or args.snapshots or args.all): | |
| parser.error("Informe ao menos uma ação: --date, --snapshots ou --all.") | |
| client = get_turso_client() | |
| # Monta a lista de comandos conforme as opções. | |
| acoes: list[tuple[str, tuple]] = [] | |
| if args.all: | |
| for tabela in _COLUNA_DATA: | |
| acoes.append((f"DELETE FROM {tabela}", ())) | |
| else: | |
| if args.snapshots: | |
| acoes.append(("DELETE FROM salesforce_snapshots", ())) | |
| if args.date: | |
| for tabela, coluna in _COLUNA_DATA.items(): | |
| acoes.append((f"DELETE FROM {tabela} WHERE {coluna} = ?", (args.date,))) | |
| print("== Estado atual ==") | |
| for tabela in _COLUNA_DATA: | |
| print(f" {tabela}: {_contar(client, tabela)} linhas") | |
| print("\n== Ações a executar ==") | |
| for sql, params in acoes: | |
| print(" -", sql, params if params else "") | |
| if not args.yes: | |
| resposta = input("\nConfirmar limpeza? (digite 'sim'): ").strip().lower() | |
| if resposta != "sim": | |
| print("Cancelado.") | |
| return | |
| for sql, params in acoes: | |
| client.execute_query(sql, params) | |
| print("\n== Estado após limpeza ==") | |
| for tabela in _COLUNA_DATA: | |
| print(f" {tabela}: {_contar(client, tabela)} linhas") | |
| print("Limpeza concluída.") | |
| if __name__ == "__main__": | |
| main() | |