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