50 lines
1.6 KiB
Python
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)
|