import asyncpg import yaml from typing import Optional import logging logger = logging.getLogger(__name__) class DatabaseManager: def __init__(self): self.pool: Optional[asyncpg.Pool] = None async def initialize(self, config: dict): """Inizializza il pool di connessioni al database""" try: self.pool = await asyncpg.create_pool( host=config['host'], port=config['port'], database=config['name'], user=config['user'], password=config['password'], min_size=config.get('pool_min_size', 5), max_size=config.get('pool_max_size', 20), max_queries=config.get('pool_max_queries', 50000), max_inactive_connection_lifetime=config.get('pool_max_inactive_connection_lifetime', 300.0) ) logger.info("Pool di connessioni database inizializzato con successo") except Exception as e: logger.error(f"Errore nell'inizializzazione del pool database: {e}") raise async def close(self): """Chiudi il pool di connessioni al database""" if self.pool: await self.pool.close() logger.info("Pool di connessioni database chiuso") async def execute_query(self, query: str, *args): """Esegui una query e restituisci i risultati""" async with self.pool.acquire() as connection: return await connection.fetch(query, *args) async def execute_one(self, query: str, *args): """Esegui una query e restituisci un singolo risultato""" async with self.pool.acquire() as connection: return await connection.fetchrow(query, *args) async def execute_command(self, query: str, *args): """Esegui un comando (INSERT, UPDATE, DELETE)""" async with self.pool.acquire() as connection: return await connection.execute(query, *args) # Istanza globale del gestore database db_manager = DatabaseManager() async def get_database(): """Dipendenza per ottenere la connessione al database""" return db_manager