| |
| """ |
| 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() |