You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

57 lines
2.1 KiB

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