| """ |
| 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 |
|
|
|
|