Files
controles/functions/base.py
Mateus Tavares 2b1668206d - inits centralizados, READMEs atualizados
- padronizando o nome de get_db_connection e session para get_db_session, para não confundir com session do Flask ou sessoes web

- corrigindo potenciais erros

-- has_permission nao consegue com lazy load carregar permission depois de load_user fechar a conexao, entao joinedLoad com Permission antes de fechar

-- db.rollback não existe caso db = get_db_session() apareça muito depois dentro do try, padronizando antes de try

--- comparar role por nivel (Role.SECRETARIO_GERAL) e nao por nome ("Secretario Geral")

- unificacao de get_otp_qr_code

- mudança de nowutc() para now(UTC) conforme novo padrão
2026-02-20 17:19:15 -03:00

38 lines
1.3 KiB
Python

import os
from sqlalchemy import create_engine, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from pathlib import Path
# Configurar caminho do banco de dados
db_path = Path(__file__).resolve().parents[1] / 'data' / 'database.db'
db_path.parent.mkdir(parents=True, exist_ok=True)
db_fallback = f'sqlite:///{db_path}'
# Configurar SQLite com opções para melhor concorrência
engine = create_engine(
os.environ.get('DATABASE_URL', db_fallback),
connect_args={
'timeout': 30, # Tempo de espera em segundos
'check_same_thread': False # Permite acesso de múltiplas threads
},
pool_pre_ping=True, # Verifica conexão antes de usar
pool_recycle=3600 # Recicla conexões após 1 hora
)
Session = sessionmaker(bind=engine)
Base = declarative_base()
def get_db_session():
"""Retorna uma nova sessão do banco de dados com PRAGMAs configuradas"""
db_session = Session()
try:
# Configurar SQLite para melhor tratamento de concorrência
db_session.execute(text("PRAGMA journal_mode=WAL"))
db_session.execute(text("PRAGMA busy_timeout=5000"))
return db_session
except Exception as e:
db_session.rollback()
db_session.close()
raise e