diff --git a/functions/base.py b/functions/base.py index fa4d546..c7c4a00 100644 --- a/functions/base.py +++ b/functions/base.py @@ -1,8 +1,7 @@ -from sqlalchemy import create_engine +from sqlalchemy import create_engine, text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from pathlib import Path -import os # Configurar caminho do banco de dados db_dir = Path.home() / '.local' / 'share' / 'controles' @@ -24,10 +23,14 @@ Session = sessionmaker(bind=engine) Base = declarative_base() def get_db_connection(): - """Retorna uma nova sessão do banco de dados""" + """Retorna uma nova sessão do banco de dados com PRAGMAs configuradas""" session = Session() try: + # Configurar SQLite para melhor tratamento de concorrência + session.execute(text("PRAGMA journal_mode=WAL")) + session.execute(text("PRAGMA busy_timeout=5000")) return session except Exception as e: session.rollback() - raise e \ No newline at end of file + session.close() + raise e diff --git a/functions/database.py b/functions/database.py index 50f9b0e..e754890 100644 --- a/functions/database.py +++ b/functions/database.py @@ -1,42 +1,17 @@ from datetime import datetime, timedelta from werkzeug.security import generate_password_hash, check_password_hash -from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Text, Numeric, Date, Enum, create_engine, text -from sqlalchemy.orm import sessionmaker, relationship, backref +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Text, Numeric, Date, Enum +from sqlalchemy.orm import relationship, backref import os import pyotp -from pathlib import Path -from sqlalchemy.pool import NullPool import secrets from flask_mail import Message from flask import url_for import enum from flask_login import UserMixin -from .rbac import Role, Permission, role_permissions, user_roles -from .base import Base, engine, Session -import logging +from .rbac import Role +from .base import Base, engine, get_db_connection -# Configurar caminho do banco de dados -db_dir = Path.home() / '.local' / 'share' / 'controles' -db_dir.mkdir(parents=True, exist_ok=True) -db_path = db_dir / 'database.db' - -DATABASE_URL = f"sqlite:///{db_path}" -engine = create_engine(DATABASE_URL) -SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) - -def get_db_connection(): - """Retorna uma nova sessão do banco de dados""" - Session = sessionmaker(bind=engine) - db = Session() - - try: - # Configurar SQLite para melhor tratamento de concorrência - db.execute(text("PRAGMA journal_mode=WAL")) - db.execute(text("PRAGMA busy_timeout=5000")) - return db - except: - db.close() - raise def execute_query(query, params=None): """ @@ -742,4 +717,4 @@ def init_database(): session.close() if __name__ == "__main__": - init_database() \ No newline at end of file + init_database() diff --git a/seed_data.py b/seed_data.py index d541d26..e596282 100644 --- a/seed_data.py +++ b/seed_data.py @@ -2,9 +2,9 @@ from datetime import datetime, timedelta from functions.database import ( Base, Militante, CotaMensal, TipoPagamento, Pagamento, MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual, - RelatorioCotasMensais, RelatorioVendasMateriais, engine, SessionLocal, + RelatorioCotasMensais, RelatorioVendasMateriais, Setor, ComiteCentral, Usuario, Role, EmailMilitante, Endereco, - ComiteRegional, Celula, EstadoMilitante + ComiteRegional, Celula, EstadoMilitante, get_db_connection ) import random from faker import Faker @@ -302,7 +302,7 @@ def criar_assinaturas(session, militantes): def seed_database(): """Função principal para popular o banco de dados""" - session = SessionLocal() + session = get_db_connection() try: print("Iniciando população do banco de dados...")