MirrorAPI/database/mysql.py
2025-11-03 15:18:26 -03:00

50 lines
1.6 KiB
Python

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from actions.config.config import Config
# === BASE ORM ===
# Essa base é herdada por todos os modelos (tabelas) do SQLAlchemy.
Base = declarative_base()
def get_database_settings():
"""
Lê e retorna as configurações do arquivo database/mysql.json,
com substituição automática das variáveis de ambiente (${VAR}).
"""
return Config.get("database/mysql.json")
def get_mysql_engine():
"""
Cria e retorna a engine de conexão com o banco MySQL.
A engine é responsável por gerenciar o pool de conexões.
"""
db = get_database_settings()
# === Monta a string DSN (Data Source Name) ===
dsn = (
f"mysql+pymysql://{db.user}:{db.password}@"
f"{db.host}:{db.port}/{db.name}?charset={db.charset}"
)
# === Cria a engine SQLAlchemy ===
engine = create_engine(
dsn,
echo=bool(getattr(db, "debug", False)), # Exibe SQLs no log se habilitado
pool_pre_ping=bool(db.pool.pre_ping), # Testa conexões antes de usar
pool_size=int(db.pool.size), # Tamanho do pool de conexões
max_overflow=int(db.pool.max_overflow), # Conexões extras permitidas
connect_args={"connect_timeout": 10}, # Timeout de conexão
)
return engine
# === Engine global ===
# Criada uma única vez durante o ciclo de vida da aplicação.
engine = get_mysql_engine()
# === Sessão ORM ===
# Cada request da aplicação cria uma instância de SessionLocal.
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)