♻️ refactor(db): migrar tools para MySQL e ajustar inicializacao

main
parent 3f1024d342
commit 78dc4de656

@ -7,21 +7,21 @@ GOOGLE_LOCATION=loc_do_seu_projeto
VERTEX_MODEL_NAME=gemini-2.5-flash
# ============================================
# CONFIGURACOES DO BANCO DE DADOS (POSTGRESQL - TOOLS)
# CONFIGURACOES DO BANCO DE DADOS (MYSQL - TOOLS)
# ============================================
# Banco principal (tools)
# Banco de metadados de tools (pode ser o mesmo banco do mock)
DB_HOST=localhost
DB_PORT=5432
DB_USER=orquestrador
DB_PORT=3306
DB_USER=root
DB_PASSWORD=SUA_SENHA
DB_NAME=orquestrador_db
DB_NAME=orquestrador_mock
# ============================================
# CONFIGURACOES DO BANCO DE DADOS (CLOUD SQL - PRODUCAO)
# CONFIGURACOES DO BANCO DE DADOS (CLOUD SQL MYSQL - PRODUCAO)
# ============================================
# Comentado ate fazer deploy. Descomente em producao.
# CLOUD_SQL_CONNECTION_NAME=optimum-tensor-343619:us-central1:orquestrador-db
# DB_CLOUD_SQL_CONNECTION_NAME=projeto:regiao:instancia-mysql-tools
# ============================================
# CONFIGURACOES DO BANCO DE DADOS MOCK (MYSQL - DADOS FICTICIOS)

@ -37,15 +37,19 @@ def get_db():
def _db_error_detail(exc: SQLAlchemyError) -> str:
text = str(exc).lower()
# Heuristica para identificar falhas no MySQL de tools.
tools_markers = ("tools", "tool")
if any(marker in text for marker in tools_markers):
return "Servico temporariamente indisponivel: banco MySQL (tools) inacessivel."
# Heuristica para identificar falhas no MySQL (base ficticia).
mysql_markers = ("mysql", "pymysql", "(2003", "mock", "3306")
if any(marker in text for marker in mysql_markers):
mysql_mock_markers = ("mock", "vehicles", "customers", "orders", "review_schedules")
if any(marker in text for marker in mysql_mock_markers):
return "Servico temporariamente indisponivel: banco MySQL (dados ficticios) inacessivel."
# Heuristica para identificar falhas no PostgreSQL (tools).
pg_markers = ("postgres", "psycopg", "postgresql", "5432", "tools")
if any(marker in text for marker in pg_markers):
return "Servico temporariamente indisponivel: banco PostgreSQL (tools) inacessivel."
mysql_generic_markers = ("mysql", "pymysql", "(2003", "3306")
if any(marker in text for marker in mysql_generic_markers):
return "Servico temporariamente indisponivel: banco MySQL inacessivel."
return "Servico temporariamente indisponivel: erro de acesso ao banco de dados."

@ -6,11 +6,13 @@ class Settings(BaseSettings):
google_location: str = "us-central1"
vertex_model_name: str = "gemini-2.5-flash"
db_host: str
db_port: int = 5432
db_user: str
db_password: str
db_name: str
# Tools database (MySQL)
db_host: str = "127.0.0.1"
db_port: int = 3306
db_user: str = "root"
db_password: str = ""
db_name: str = "orquestrador_mock"
db_cloud_sql_connection_name: str | None = None
# Mock database (MySQL) for fictitious business data
mock_db_host: str = "127.0.0.1"
@ -26,7 +28,7 @@ class Settings(BaseSettings):
environment: str = "production"
debug: bool = False
# Cloud SQL
# Cloud SQL (legacy Postgres var kept only for backward compatibility in deploy scripts)
cloud_sql_connection_name: str | None = None
# Cloud Run networking (for deploy script / documentation)

@ -1,17 +1,21 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.orm import declarative_base, sessionmaker
from app.core.settings import settings
if settings.cloud_sql_connection_name:
# Cloud Run - PostgreSQL via Unix socket
cloud_sql_tools = settings.db_cloud_sql_connection_name or settings.cloud_sql_connection_name
if cloud_sql_tools:
# MySQL via Unix socket (Cloud SQL)
DATABASE_URL = (
f"postgresql+psycopg://{settings.db_user}:{settings.db_password}@/{settings.db_name}"
f"?host=/cloudsql/{settings.cloud_sql_connection_name}"
f"mysql+pymysql://{settings.db_user}:{settings.db_password}@/{settings.db_name}"
f"?unix_socket=/cloudsql/{cloud_sql_tools}"
)
else:
# Ambiente local/VPN - PostgreSQL em host/porta configurados
# Ambiente local/VPN - MySQL em host/porta configurados
DATABASE_URL = (
f"postgresql+psycopg://{settings.db_user}:{settings.db_password}@"
f"mysql+pymysql://{settings.db_user}:{settings.db_password}@"
f"{settings.db_host}:{settings.db_port}/{settings.db_name}"
)

@ -16,13 +16,13 @@ def init_db():
print("Inicializando bancos...")
try:
print("Criando tabelas PostgreSQL (tools)...")
print("Criando tabelas MySQL (tools)...")
Base.metadata.create_all(bind=engine)
print("Populando tools iniciais...")
seed_tools()
print("PostgreSQL OK.")
print("MySQL tools OK.")
except Exception as exc:
print(f"Aviso: falha no PostgreSQL (tools): {exc}")
print(f"Aviso: falha no MySQL (tools): {exc}")
try:
print("Criando tabelas MySQL (dados ficticios)...")

@ -21,15 +21,15 @@ async def startup_event():
"""
print("[Auto-Seed] Iniciando configuracao do banco...")
# PostgreSQL (tools) e MySQL (mock) sobem de forma independente.
# Tools (MySQL) e mock (MySQL) sobem de forma independente.
try:
Base.metadata.create_all(bind=engine)
if settings.auto_seed_tools:
from app.db.tool_seed import seed_tools
seed_tools()
print("[Auto-Seed] PostgreSQL de tools inicializado.")
print("[Auto-Seed] MySQL de tools inicializado.")
except Exception as e:
print(f"[Auto-Seed] Aviso: falha ao inicializar PostgreSQL (tools): {e}")
print(f"[Auto-Seed] Aviso: falha ao inicializar MySQL (tools): {e}")
try:
MockBase.metadata.create_all(bind=mock_engine)

Loading…
Cancel
Save