analytical_force / scripts /clean_db.py
ViniciusKhan's picture
API robusta + Transformers + front + fix Turso
a8beb6e
Raw
History Blame Contribute Delete
3.52 kB
"""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()