|
|
|
|
|
""" |
|
|
init_db.py — Inicializa o banco ATUAL (roteado pelo db_router/banco). |
|
|
- Cria/atualiza o schema (Base.metadata.create_all) no banco selecionado. |
|
|
- Realiza seed idempotente dos usuários padrão com hash via utils_seguranca. |
|
|
- Não usa caminhos fixos; respeita o banco escolhido na UI (prod/test/treinamento). |
|
|
|
|
|
Uso: |
|
|
- Execute este arquivo diretamente, ou |
|
|
- Importe e chame run() a partir do app, após selecionar o banco. |
|
|
""" |
|
|
|
|
|
from __future__ import annotations |
|
|
|
|
|
from datetime import datetime |
|
|
from sqlalchemy import text |
|
|
from sqlalchemy.exc import SQLAlchemyError |
|
|
|
|
|
|
|
|
from banco import get_engine, init_schema, SessionLocal, db_info |
|
|
|
|
|
|
|
|
import models |
|
|
|
|
|
|
|
|
from utils_seguranca import gerar_hash_senha |
|
|
|
|
|
|
|
|
def _print_header(): |
|
|
try: |
|
|
info = db_info() |
|
|
print("===== Application Startup — init_db.run() =====") |
|
|
print(f"📦 Router ativo? {info.get('using_router')}") |
|
|
label = info.get("label") or info.get("choice") or "(desconhecido)" |
|
|
print(f"🏷️ Banco selecionado: {label}") |
|
|
print(f"🔗 URL: {info.get('url')}") |
|
|
except Exception as e: |
|
|
print(f"ℹ️ db_info indisponível: {e}") |
|
|
|
|
|
|
|
|
def _seed_usuarios(db): |
|
|
""" |
|
|
Insere usuários padrão se não existirem. |
|
|
Usa gerar_hash_senha(senha_plana) -> hash (bcrypt). |
|
|
""" |
|
|
from models import Usuario |
|
|
|
|
|
usuarios_padrao = [ |
|
|
("admin", "admin123", "admin"), |
|
|
("usuario", "usuario123", "usuario"), |
|
|
("consulta", "consulta123", "consulta"), |
|
|
] |
|
|
|
|
|
for nome, senha_plana, perfil in usuarios_padrao: |
|
|
try: |
|
|
existe = db.query(Usuario).filter(Usuario.usuario == nome).first() |
|
|
except Exception: |
|
|
|
|
|
init_schema() |
|
|
existe = db.query(Usuario).filter(Usuario.usuario == nome).first() |
|
|
|
|
|
if not existe: |
|
|
try: |
|
|
senha_hash = gerar_hash_senha(senha_plana) |
|
|
except Exception as e: |
|
|
print(f"❌ Falha ao gerar hash para '{nome}': {e}") |
|
|
continue |
|
|
|
|
|
novo = Usuario( |
|
|
usuario=nome, |
|
|
senha=senha_hash, |
|
|
perfil=perfil, |
|
|
ativo=True, |
|
|
data_criacao=datetime.utcnow(), |
|
|
nome=nome.capitalize(), |
|
|
email=None, |
|
|
) |
|
|
db.add(novo) |
|
|
print(f"✅ Usuário '{nome}' criado") |
|
|
else: |
|
|
print(f"ℹ️ Usuário '{nome}' já existe") |
|
|
|
|
|
|
|
|
def run(): |
|
|
""" |
|
|
Executa a inicialização do banco atual: |
|
|
- Cria/atualiza schema |
|
|
- Insere usuários padrão (idempotente) |
|
|
""" |
|
|
_print_header() |
|
|
|
|
|
|
|
|
try: |
|
|
init_schema() |
|
|
except Exception as e: |
|
|
print(f"❌ Falha ao criar/atualizar schema: {e}") |
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
db = SessionLocal() |
|
|
try: |
|
|
_seed_usuarios(db) |
|
|
db.commit() |
|
|
print("✅ Banco inicializado com sucesso!") |
|
|
except SQLAlchemyError as e: |
|
|
db.rollback() |
|
|
print(f"❌ Erro SQL ao inicializar banco: {e}") |
|
|
except Exception as e: |
|
|
db.rollback() |
|
|
print(f"❌ Erro ao inicializar banco: {e}") |
|
|
finally: |
|
|
try: |
|
|
db.close() |
|
|
except Exception: |
|
|
pass |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
run() |