Roudrigus commited on
Commit
4019e91
·
verified ·
1 Parent(s): a7cdbad

Update db_router.py

Browse files
Files changed (1) hide show
  1. db_router.py +33 -44
db_router.py CHANGED
@@ -6,17 +6,15 @@ db_router.py — Roteia Engine/SessionLocal para:
6
  - 'treinamento' → Load_treinamento.db
7
 
8
  Mantém a escolha do usuário em st.session_state (quando disponível).
9
- Exibe uma API simples esperada pelo banco.py:
10
-
11
- set_db_choice("prod"|"test"|"treinamento") → define o banco ativo
12
- current_db_choice() → retorna 'prod' | 'test' | 'treinamento'
13
- get_engine() → engine do banco ativo (SQLite)
14
- get_session_factory() → sessionmaker do banco ativo
15
- • SessionLocal() → sessão no banco ativo
16
-
17
- Compatibilidade:
18
- - Se Streamlit não estiver disponível (execução fora do app), usa cache global interno (fallback).
19
- - Pode ler URLs do .env/Secrets (opcional) para apontar bancos em outro local/driver.
20
  """
21
 
22
  from __future__ import annotations
@@ -44,12 +42,7 @@ PROD_DB_NAME = "Load.db"
44
  TEST_DB_NAME = "Load_teste.db"
45
  TREINAMENTO_DB_NAME = "Load_treinamento.db"
46
 
47
- # ============================
48
- # (Opcional) uso de .env/Secrets
49
- # ============================
50
- # Se quiser apontar para outros caminhos/URIs via Secrets do Spaces:
51
- # DB1_PROD_URL, DB2_TEST_URL, DB3_TREINAMENTO_URL
52
- # Se não definir, usamos o SQLite no diretório do projeto.
53
  DB1_PROD_URL = os.getenv("DB1_PROD_URL", f"sqlite:///{os.path.join(BASE_DIR, PROD_DB_NAME)}")
54
  DB2_TEST_URL = os.getenv("DB2_TEST_URL", f"sqlite:///{os.path.join(BASE_DIR, TEST_DB_NAME)}")
55
  DB3_TREINAMENTO_URL = os.getenv("DB3_TREINAMENTO_URL", f"sqlite:///{os.path.join(BASE_DIR, TREINAMENTO_DB_NAME)}")
@@ -67,34 +60,28 @@ DB_LABELS: Dict[str, str] = {
67
  }
68
 
69
  # ============================
70
- # (Opcional) normalização de case para SQLite
71
  # ============================
72
- # Se você quiser garantir que exista também uma cópia "load.db" (minúsculo)
73
- # a partir de "Load.db" (maiúsculo) — útil se outros módulos esperarem minúsculas:
74
- _ENABLE_SQLITE_LOWERCASE_ALIAS = False # mude para True se quiser habilitar
75
-
76
- def _ensure_sqlite_lowercase_alias():
77
- import shutil
78
- # Para cada caminho SQLite "Load*.db", garantir um "load*.db"
79
- for key, url in DB_URLS.items():
80
- if not url.startswith("sqlite:///"):
81
- continue
82
- path = url.replace("sqlite:///", "", 1)
83
- # Se usar caminho relativo da BASE_DIR, resolva:
84
- if not os.path.isabs(path):
85
- path = os.path.join(BASE_DIR, path)
86
- dirn, fname = os.path.split(path)
87
- lower_name = fname.lower()
88
- lower_path = os.path.join(dirn, lower_name)
89
- if fname != lower_name and os.path.exists(path) and not os.path.exists(lower_path):
90
- try:
91
- shutil.copy(path, lower_path)
92
- except Exception:
93
- # Se falhar, ignora (não é crítico)
94
- pass
95
-
96
- if _ENABLE_SQLITE_LOWERCASE_ALIAS:
97
- _ensure_sqlite_lowercase_alias()
98
 
99
  # ============================
100
  # Helpers de UI
@@ -188,6 +175,8 @@ def get_engine():
188
  return cached
189
 
190
  url = _url_for_choice(choice)
 
 
191
  eng = create_engine(url, **_engine_args_for_url(url))
192
  setattr(eng, "__db_choice__", choice)
193
  _session_set(SESSION_DB_ENGINE_KEY, eng)
 
6
  - 'treinamento' → Load_treinamento.db
7
 
8
  Mantém a escolha do usuário em st.session_state (quando disponível).
9
+ Expõe:
10
+ • set_db_choice("prod"|"test"|"treinamento")
11
+ current_db_choice()
12
+ get_engine()
13
+ get_session_factory()
14
+ SessionLocal()
15
+
16
+ Inclui garantia de criação do diretório pai do SQLite.
17
+ Compatível com execução fora do Streamlit (fallback em estado global).
 
 
18
  """
19
 
20
  from __future__ import annotations
 
42
  TEST_DB_NAME = "Load_teste.db"
43
  TREINAMENTO_DB_NAME = "Load_treinamento.db"
44
 
45
+ # (Opcional) uso de .env/Secrets para apontar outras URIs (Postgres/MySQL/SQLite abs.)
 
 
 
 
 
46
  DB1_PROD_URL = os.getenv("DB1_PROD_URL", f"sqlite:///{os.path.join(BASE_DIR, PROD_DB_NAME)}")
47
  DB2_TEST_URL = os.getenv("DB2_TEST_URL", f"sqlite:///{os.path.join(BASE_DIR, TEST_DB_NAME)}")
48
  DB3_TREINAMENTO_URL = os.getenv("DB3_TREINAMENTO_URL", f"sqlite:///{os.path.join(BASE_DIR, TREINAMENTO_DB_NAME)}")
 
60
  }
61
 
62
  # ============================
63
+ # Garantir diretório do SQLite
64
  # ============================
65
+ def _ensure_parent_dir_sqlite(url: str) -> str:
66
+ """
67
+ Garante que a pasta do arquivo SQLite exista. Se não conseguir,
68
+ direciona para ~/.ioirun/<arquivo>.db (gravável no Spaces).
69
+ """
70
+ if not url or not url.startswith("sqlite"):
71
+ return url
72
+ path = url.replace("sqlite:///", "", 1)
73
+ if path.startswith("//"):
74
+ path = path[1:]
75
+ file_path = os.path.abspath(path)
76
+ parent = os.path.dirname(file_path)
77
+ try:
78
+ os.makedirs(parent, exist_ok=True)
79
+ return url
80
+ except Exception:
81
+ home_dir = os.path.join(os.path.expanduser("~"), ".ioirun")
82
+ os.makedirs(home_dir, exist_ok=True)
83
+ alt = os.path.join(home_dir, os.path.basename(file_path))
84
+ return f"sqlite:///{alt}"
 
 
 
 
 
 
85
 
86
  # ============================
87
  # Helpers de UI
 
175
  return cached
176
 
177
  url = _url_for_choice(choice)
178
+ url = _ensure_parent_dir_sqlite(url) # ⬅️ garante diretório pai
179
+
180
  eng = create_engine(url, **_engine_args_for_url(url))
181
  setattr(eng, "__db_choice__", choice)
182
  _session_set(SESSION_DB_ENGINE_KEY, eng)