Roudrigus commited on
Commit
b31dde2
·
verified ·
1 Parent(s): bbfaecc

Update init_db.py

Browse files
Files changed (1) hide show
  1. init_db.py +120 -38
init_db.py CHANGED
@@ -1,38 +1,120 @@
1
- from banco import engine, SessionLocal, Base
2
- import models
3
- from models import Usuario
4
- from utils_seguranca import gerar_hash_senha
5
-
6
- # Cria todas as tabelas definidas nos modelos
7
- Base.metadata.create_all(bind=engine)
8
-
9
- db = SessionLocal()
10
-
11
- try:
12
- usuarios_padrao = [
13
- ("admin", "admin123", "admin"),
14
- ("usuario", "usuario123", "usuario"),
15
- ("consulta", "consulta123", "consulta"),
16
- ]
17
-
18
- for nome, senha, perfil in usuarios_padrao:
19
- existe = db.query(Usuario).filter(Usuario.usuario == nome).first()
20
-
21
- if not existe:
22
- novo = Usuario(
23
- usuario=nome,
24
- senha=gerar_hash_senha(senha),
25
- perfil=perfil,
26
- ativo=True
27
- )
28
- db.add(novo)
29
- print(f"✅ Usuário '{nome}' criado")
30
- else:
31
- print(f"ℹ️ Usuário '{nome}' já existe")
32
-
33
- db.commit()
34
-
35
- finally:
36
- db.close()
37
-
38
- print(" Banco inicializado com sucesso!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ init_db.py Inicializa o banco ATUAL (roteado pelo db_router/banco).
4
+ - Cria/atualiza o schema (Base.metadata.create_all) no banco selecionado.
5
+ - Realiza seed idempotente dos usuários padrão com hash via utils_seguranca.
6
+ - Não usa caminhos fixos; respeita o banco escolhido na UI (prod/test/treinamento).
7
+
8
+ Uso:
9
+ - Execute este arquivo diretamente, ou
10
+ - Importe e chame run() a partir do app, após selecionar o banco.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from datetime import datetime
16
+ from sqlalchemy import text
17
+ from sqlalchemy.exc import SQLAlchemyError
18
+
19
+ # 👇 Usa as fábricas dinâmicas do módulo banco (que delegam ao db_router)
20
+ from banco import get_engine, init_schema, SessionLocal, db_info
21
+
22
+ # Importa seus modelos para garantir que o metadata conheça todas as tabelas
23
+ import models # noqa: F401 (garante o registro das classes no metadata)
24
+
25
+ # Utilitário de hash (bcrypt) já existente no seu projeto
26
+ from utils_seguranca import gerar_hash_senha
27
+
28
+
29
+ def _print_header():
30
+ try:
31
+ info = db_info()
32
+ print("===== Application Startup — init_db.run() =====")
33
+ print(f"📦 Router ativo? {info.get('using_router')}")
34
+ label = info.get("label") or info.get("choice") or "(desconhecido)"
35
+ print(f"🏷️ Banco selecionado: {label}")
36
+ print(f"🔗 URL: {info.get('url')}")
37
+ except Exception as e:
38
+ print(f"ℹ️ db_info indisponível: {e}")
39
+
40
+
41
+ def _seed_usuarios(db):
42
+ """
43
+ Insere usuários padrão se não existirem.
44
+ Usa gerar_hash_senha(senha_plana) -> hash (bcrypt).
45
+ """
46
+ from models import Usuario # import interno para evitar custos em startup
47
+
48
+ usuarios_padrao = [
49
+ ("admin", "admin123", "admin"),
50
+ ("usuario", "usuario123", "usuario"),
51
+ ("consulta", "consulta123", "consulta"),
52
+ ]
53
+
54
+ for nome, senha_plana, perfil in usuarios_padrao:
55
+ try:
56
+ existe = db.query(Usuario).filter(Usuario.usuario == nome).first()
57
+ except Exception:
58
+ # Se a tabela ainda não estiver criada (latência em provedor), reforça schema
59
+ init_schema()
60
+ existe = db.query(Usuario).filter(Usuario.usuario == nome).first()
61
+
62
+ if not existe:
63
+ try:
64
+ senha_hash = gerar_hash_senha(senha_plana)
65
+ except Exception as e:
66
+ print(f"❌ Falha ao gerar hash para '{nome}': {e}")
67
+ continue
68
+
69
+ novo = Usuario(
70
+ usuario=nome,
71
+ senha=senha_hash, # ⚠️ Armazena HASH, nunca em texto puro
72
+ perfil=perfil,
73
+ ativo=True,
74
+ data_criacao=datetime.utcnow(),
75
+ nome=nome.capitalize(),
76
+ email=None, # ajuste se quiser e-mail padrão
77
+ )
78
+ db.add(novo)
79
+ print(f"✅ Usuário '{nome}' criado")
80
+ else:
81
+ print(f"ℹ️ Usuário '{nome}' já existe")
82
+
83
+
84
+ def run():
85
+ """
86
+ Executa a inicialização do banco atual:
87
+ - Cria/atualiza schema
88
+ - Insere usuários padrão (idempotente)
89
+ """
90
+ _print_header()
91
+
92
+ # 1) Cria/atualiza schema no banco ATUAL
93
+ try:
94
+ init_schema()
95
+ except Exception as e:
96
+ print(f"❌ Falha ao criar/atualizar schema: {e}")
97
+ # ainda assim tenta seguir, pois alguns provedores aplicam lazy
98
+ pass
99
+
100
+ # 2) Seed de usuários
101
+ db = SessionLocal()
102
+ try:
103
+ _seed_usuarios(db)
104
+ db.commit()
105
+ print("✅ Banco inicializado com sucesso!")
106
+ except SQLAlchemyError as e:
107
+ db.rollback()
108
+ print(f"❌ Erro SQL ao inicializar banco: {e}")
109
+ except Exception as e:
110
+ db.rollback()
111
+ print(f"❌ Erro ao inicializar banco: {e}")
112
+ finally:
113
+ try:
114
+ db.close()
115
+ except Exception:
116
+ pass
117
+
118
+
119
+ if __name__ == "__main__":
120
+ run()