python ubuntu pymssql

python - ¿Cómo configurar pymssql con soporte SSL en Ubuntu?



(3)

¿Cuáles son los pasos necesarios para configurar pymssql con soporte SSL en Ubuntu para poder conectarme a una instancia de SQL Server que requiera una conexión encriptada (por ejemplo, Azure)?


Ubuntu 16.04 LTS

(Ver esta respuesta para Ubuntu 18.04 LTS.)

Lo siguiente funcionó para mí en una instalación limpia de Xubuntu 16.04 LTS x64:

El primer desafío es que el FreeTDS que obtenemos de los repositorios de Ubuntu 16.04 no es compatible con SSL "fuera de la caja", por lo que necesitamos construir el nuestro. Comience instalando python3-pip (que también instala build-essentials, g ++ y un montón de otras cosas que necesitaremos) y libssl-dev (las bibliotecas OpenSSL requeridas para construir FreeTDS con soporte SSL)

sudo apt install python3-pip libssl-dev

Descargue el código fuente de FreeTDS haciendo clic en el enlace "Versión estable" en freetds.org . Descomprima el archivo, cambie al directorio que acaba de crear (por ejemplo, freetds-1.00.104) y luego haga

./configure --with-openssl=/usr/include/openssl --enable-msdblib make sudo make install

Comprueba la construcción con

tsql -C

y asegúrese de que "TDS version: auto" y "OpenSSL: yes" estén en la lista. Luego use tsql para probar una conexión FreeTDS "en bruto", por ejemplo,

tsql -H example.com -p 1433 -U youruserid -P yourpassword

Ahora para instalar pymssql. De forma predeterminada, las versiones recientes se envían como un archivo "rueda" precompilado que no admite conexiones cifradas, por lo que debemos instalarlo desde la fuente pymssql. Comenzando con pymssql 2.1.4, el proceso de compilación se basa en Cython, así que primero

pip3 install --user Cython

y luego hacer

pip3 install --user --no-binary pymssql pymssql

Cuando se completa la compilación, se instala pymssql.

Pero ... no funcionará (todavía). Cuando intentamos import pymssql en Python obtenemos

ImportError: libsybdb.so.5: no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio

porque aparentemente ese archivo está en el lugar "incorrecto". La solución (ref: here ) es crear un enlace simbólico en el lugar "correcto" que apunte al archivo real

sudo ln -s /usr/local/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5 sudo ldconfig

Ahora pymssql funciona con conexiones SSL.

Para mí, de todos modos.


Ubuntu 18.04 LTS

Los repositorios de Ubuntu 18.04 instalarán una versión de FreeTDS que admita GnuTLS, por lo que no es absolutamente necesario construir FreeTDS desde la fuente. Sin embargo, todavía necesitamos construir pymssql desde la fuente porque simplemente haciendo lo habitual

pip3 install --user pymssql

instalará una "rueda" precompilada que no admite conexiones seguras. En cambio, tenemos que hacer

sudo apt install python3-pip freetds-dev pip3 install --user Cython pip3 install --user --no-binary pymssql pymssql


Para Ubuntu 16.04 parece que al menos los contenedores Docker tienen una versión FreeTDS que ya es compatible con SSL.

Además, al menos para Python 2.7, Cython no es necesario:

https://github.com/tds-fdw/ci-setup/blob/master/ubuntu16.04/Dockerfile (líneas 23-39)

¡Pero hay algo a tener en cuenta!

La versión de TDS para conectarse a Azure debe ser forzada al menos a 7.1 (o más reciente, según sus necesidades: https://www.freetds.org/userguide/choosingtdsprotocol.htm )

De lo contrario, verá lo infame:

[ERROR] (20017, ''Mensaje de error DB-Lib 20017, gravedad 9: / nEOF inesperado del servidor / n Error de red-Lib durante la operación ahora en progreso (115) / nDB-Lib mensaje de error 20002, gravedad 9: / n Servidor adaptativo conexión fallida / n '')

Por alguna razón, esto no era necesario para Ubuntu 14.04 y pymssql 2.1.3 sin ninguna configuración adicional ( https://github.com/tds-fdw/ci-setup/blob/master/ubuntu14.04/Dockerfile )

Se puede hacer con:

export TDSVER=7.1

O, en el código de Python, y en la función de conexión, agregue el parámetro:

tds_version=''7.1''

Con eso, puedo usar pymssql 2.1.4 para conectarme a Azure sin problemas.