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)