|
|
""" |
|
|
Funções para gerenciamento de banco de dados e processamento de CSV |
|
|
""" |
|
|
import os |
|
|
import pandas as pd |
|
|
from sqlalchemy import create_engine |
|
|
from sqlalchemy.types import DateTime, Integer, Float |
|
|
from langchain_community.utilities import SQLDatabase |
|
|
import logging |
|
|
from typing import Optional |
|
|
|
|
|
from utils.config import SQL_DB_PATH |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_engine_from_processed_dataframe(processed_df: pd.DataFrame, sql_types: dict, sql_db_path: str = SQL_DB_PATH): |
|
|
""" |
|
|
Cria engine SQLAlchemy a partir de DataFrame já processado |
|
|
NOVA VERSÃO - usa processamento genérico |
|
|
|
|
|
Args: |
|
|
processed_df: DataFrame já processado |
|
|
sql_types: Dicionário com tipos SQL para as colunas |
|
|
sql_db_path: Caminho para o banco SQLite |
|
|
|
|
|
Returns: |
|
|
SQLAlchemy Engine |
|
|
""" |
|
|
logging.info("Criando banco de dados a partir de DataFrame processado...") |
|
|
engine = create_engine(f"sqlite:///{sql_db_path}") |
|
|
|
|
|
logging.info("[DEBUG] Tipos das colunas processadas:") |
|
|
logging.info(processed_df.dtypes) |
|
|
|
|
|
|
|
|
processed_df.to_sql("tabela", engine, index=False, if_exists="replace", dtype=sql_types) |
|
|
logging.info(f"Banco de dados SQL criado com sucesso! {len(processed_df)} registros salvos") |
|
|
return engine |
|
|
|
|
|
def create_sql_database(engine) -> SQLDatabase: |
|
|
""" |
|
|
Cria objeto SQLDatabase do LangChain a partir de uma engine |
|
|
|
|
|
Args: |
|
|
engine: SQLAlchemy Engine |
|
|
|
|
|
Returns: |
|
|
SQLDatabase do LangChain |
|
|
""" |
|
|
return SQLDatabase(engine=engine) |
|
|
|
|
|
def get_sample_data(engine, limit: int = 10) -> pd.DataFrame: |
|
|
""" |
|
|
Obtém dados de amostra do banco para contexto |
|
|
|
|
|
Args: |
|
|
engine: SQLAlchemy Engine |
|
|
limit: Número de linhas para retornar |
|
|
|
|
|
Returns: |
|
|
DataFrame com dados de amostra |
|
|
""" |
|
|
try: |
|
|
return pd.read_sql_query(f"SELECT * FROM tabela LIMIT {limit}", engine) |
|
|
except Exception as e: |
|
|
logging.error(f"Erro ao obter dados de amostra: {e}") |
|
|
return pd.DataFrame() |
|
|
|
|
|
def validate_database(engine) -> bool: |
|
|
""" |
|
|
Valida se o banco de dados está funcionando corretamente |
|
|
|
|
|
Args: |
|
|
engine: SQLAlchemy Engine |
|
|
|
|
|
Returns: |
|
|
True se válido, False caso contrário |
|
|
""" |
|
|
try: |
|
|
|
|
|
result = pd.read_sql_query("SELECT COUNT(*) as count FROM tabela", engine) |
|
|
count = result.iloc[0]['count'] |
|
|
logging.info(f"Banco validado: {count} registros encontrados") |
|
|
return count > 0 |
|
|
except Exception as e: |
|
|
logging.error(f"Erro na validação do banco: {e}") |
|
|
return False |
|
|
|
|
|
|