From 1edbb89ce07c95df65640648aebfcd2bf895b7d4 Mon Sep 17 00:00:00 2001 From: desoladorxx Date: Wed, 22 Jul 2026 16:51:52 -0500 Subject: [PATCH] Instalar msodbcsql18 y auto-detectar driver de SQL Server en Linux/Windows --- backend/Dockerfile | 7 ++++++- backend/data_manager.py | 18 ++++++++++++++++-- backend/data_manager_v2.py | 18 ++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 30cb3b2..a900e98 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,7 +1,12 @@ FROM python:3.10-slim +# Instalar dependencias del sistema y el Driver Oficial de Microsoft ODBC 18 para SQL Server en Linux RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc g++ unixodbc-dev curl \ + curl gnupg2 ca-certificates unixodbc unixodbc-dev gcc g++ \ + && curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \ + && curl -fsSL https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list \ + && apt-get update \ + && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app diff --git a/backend/data_manager.py b/backend/data_manager.py index cbc7fb9..13a7ae3 100644 --- a/backend/data_manager.py +++ b/backend/data_manager.py @@ -43,12 +43,26 @@ class DataManager: def sql_conn(self): import pyodbc + driver = os.getenv("SQL_DRIVER") + if not driver: + installed = pyodbc.drivers() + if "ODBC Driver 18 for SQL Server" in installed: + driver = "ODBC Driver 18 for SQL Server" + elif "ODBC Driver 17 for SQL Server" in installed: + driver = "ODBC Driver 17 for SQL Server" + elif "FreeTDS" in installed: + driver = "FreeTDS" + else: + driver = "SQL Server" + conn_str = ( - f"DRIVER={{SQL Server}};SERVER={self.sql_server};" - f"DATABASE={self.sql_db};UID={self.sql_user};PWD={self.sql_pass}" + f"DRIVER={{{driver}}};SERVER={self.sql_server};" + f"DATABASE={self.sql_db};UID={self.sql_user};PWD={self.sql_pass};" + "Encrypt=no;TrustServerCertificate=yes;" ) return pyodbc.connect(conn_str) + # ── Config de campañas (GitHub, opcional) ─────────────────── def _cargar_campanias(self): if not self.github_campanias_url: diff --git a/backend/data_manager_v2.py b/backend/data_manager_v2.py index bf0e1ac..99dffe7 100644 --- a/backend/data_manager_v2.py +++ b/backend/data_manager_v2.py @@ -138,12 +138,26 @@ class DataManager: def sql_conn(self): import pyodbc + driver = os.getenv("SQL_DRIVER") + if not driver: + installed = pyodbc.drivers() + if "ODBC Driver 18 for SQL Server" in installed: + driver = "ODBC Driver 18 for SQL Server" + elif "ODBC Driver 17 for SQL Server" in installed: + driver = "ODBC Driver 17 for SQL Server" + elif "FreeTDS" in installed: + driver = "FreeTDS" + else: + driver = "SQL Server" + conn_str = ( - f"DRIVER={{SQL Server}};SERVER={self.sql_server};" - f"DATABASE={self.sql_db};UID={self.sql_user};PWD={self.sql_pass}" + f"DRIVER={{{driver}}};SERVER={self.sql_server};" + f"DATABASE={self.sql_db};UID={self.sql_user};PWD={self.sql_pass};" + "Encrypt=no;TrustServerCertificate=yes;" ) return pyodbc.connect(conn_str) + # ── CHATWOOT: leads de pauta (mapa de campañas, dedup por mensaje) ── def traer_leads_chatwoot(self): sql = f"""