diff --git a/.env.example b/.env.example index 269ea0c..cb4bfff 100644 --- a/.env.example +++ b/.env.example @@ -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) diff --git a/app/api/routes.py b/app/api/routes.py index fdb6149..12a2ec5 100644 --- a/app/api/routes.py +++ b/app/api/routes.py @@ -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." diff --git a/app/core/settings.py b/app/core/settings.py index 0672efb..ba4b5fa 100644 --- a/app/core/settings.py +++ b/app/core/settings.py @@ -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) diff --git a/app/db/database.py b/app/db/database.py index 1d157f8..e12053f 100644 --- a/app/db/database.py +++ b/app/db/database.py @@ -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}" ) diff --git a/app/db/init_db.py b/app/db/init_db.py index 23a76f9..77fb1de 100644 --- a/app/db/init_db.py +++ b/app/db/init_db.py @@ -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)...") diff --git a/app/main.py b/app/main.py index 59a9a44..670f98e 100644 --- a/app/main.py +++ b/app/main.py @@ -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)