Update db_router.py
Browse files- 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 |
-
|
| 10 |
-
|
| 11 |
-
•
|
| 12 |
-
•
|
| 13 |
-
•
|
| 14 |
-
•
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 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 |
-
#
|
| 71 |
# ============================
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 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)
|