Pyodbc no puede encontrar el controlador FreeTDS

Estoy en una máquina Centos 7 Linux tratando de conectarme a una base de datos SQL a través de pyodbc. Aprendí que necesitas configurar el DSN y lo haces instalando el controlador freetds y haciendo algo como:

import pyodbc cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER=example;DATABASE=TEST;') 

Desafortunadamente, cuando hago eso, aparece un error que dice que no se puede encontrar el controlador FreeTDS. He corrido

 $ ./configure $ make $ make install 

Parecía haberlo instalado pero me sale el mismo error. ¿Puede alguien enviarme un enlace a un ejemplo de trabajo?

Si está comstackndo FreeTDS desde la fuente, se instalará en / usr / local / freetds, IIRC. También puede instalar a través de yum en CentOS, y también necesitará unixODBC. Básicamente, FreeTDS crea un puente entre SQL Server y unixODBC, y pyodbc une unixODBC con Python.

Aquí hay un ejemplo de configuración con FreeTDS, unixODBC y amigos:

freetds.conf:

 [server] host = server.com port = 1433 tds version = 7.3 

odbc.ini:

 [server] Driver = FreeTDS Server = server.com Port = 1433 TDS_Version = 7.3 

odbcinst.ini:

 [FreeTDS] Description = FreeTDS with Protocol up to 7.3 Driver = /usr/lib64/libtdsodbc.so.0 

La ubicación de Driver = puede diferir arriba, dependiendo de su distribución de FreeTDS – si compiló desde la fuente, muy probablemente, /usr/local/freetds/lib/libtdsodbc.so .

pyodbc connect, sin DSN:

 DRIVER={FreeTDS};SERVER=server.com;PORT=1433;DATABASE=dbname;UID=dbuser;PWD=dbpassword;TDS_Version=7.3; 

Algunas notas:

  • Tendrá que actualizar la versión de TDS para que coincida con la versión de SQL Server que está ejecutando y la versión de TDS gratuita que está ejecutando. La versión 0.95 es compatible con la versión 7.3 de TDS.
  • La versión 7.3 de TDS funcionará con MS SQL Server 2008 y superior.
  • Use la versión 7.2 de TDS para MS SQL Server 2005.

Vea aquí para más:

https://msdn.microsoft.com/en-us/library/dd339982.aspx

Buena suerte.

Para basarse en la respuesta de @ FlipperPA , no es obvio cómo pyodbc “encuentra” el controlador FreeTDS. Si tienes este error:

 pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found (0) (SQLDriverConnect)") 

Puede haber otras causas posibles, incluido un entorno incorrecto. Esto es lo que descubrí:

pyodbc es un envoltorio alrededor de unixODBC, que no está documentado, pero necesita instalar los paquetes de desarrollo de unixODBC antes de poder pip install pyodbc . pyodbc pasa la cadena de conexión directamente a unixODBC.

unixODBC necesita cargar una biblioteca compartida que contenga el controlador de base de datos ODBC, por ejemplo libtdsodbc.so para FreeTDS. Puede establecer el parámetro DRIVER en la cadena de conexión a una de dos cosas:

  • O bien la ruta directa al archivo de biblioteca compartida (por ejemplo, /usr/local/lib/libtdsodbc.so )
  • O el nombre de una sección de configuración en odbcinst.ini , que contiene una configuración de Driver = ... que apunta al archivo de biblioteca compartida

Se garantiza la primera forma de encontrar la biblioteca compartida, y una buena manera de verificar si tiene problemas de entorno, pero la segunda es preferible y más portátil. Vea aquí para más detalles:

Este archivo ini simplemente lista todos los controladores instalados. Se encuentra en /etc/odbcinst.ini. La syntax es simple; un nombre seguido de una propiedad que nos indica el nombre del archivo de los controladores. Por ejemplo;

 [Sybase 11] Comment = Super Duper Sybase Server Driver = /usr/lib/libsybase.so.11 Setup = /usr/lib/libsybaseS.so.11 FileUsage = 1 

El nombre del archivo del controlador (es decir, /usr/lib/libsybase.so.11 ) debe ser único. El nombre Sybase 11 (es decir, Sybase 11 ) también debe ser único.

Sin embargo, esto solo puede funcionar si unixODBC puede encontrar su archivo odbcinst.ini . Parece buscarlo:

  • en su directorio de inicio con un nombre modificado, .odbcinst.ini
  • En el directorio al que ODBCSYSINI la variable de entorno ODBCSYSINI , si está configurado.
  • De lo contrario, en /etc

Para FreeTDS debería contener algo como esto:

 [FreeTDS] Description = For example, my database server name or FreeTDS version Driver = /usr/local/lib/libtdsodbc.so 

Solo entonces puede usar DRIVER=FreeTDS en una cadena de conexión y esperar que funcione (y no obtenga el error anterior).

Es posible que también desee utilizar el comando ldd (en Linux) para verificar que todas las dependencias de la biblioteca estén satisfechas, y el cargador de biblioteca dinámica, ld.so puede encontrarlas y ld.so :

 ldd /usr/local/lib/libtdsodbc.so ldd: warning: you do not have execution permission for `/usr/local/lib/libtdsodbc.so' linux-vdso.so.1 => (0x00007ffe145fe000) libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007f81f9dfd000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f81f9bf8000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f81f99dc000) libc.so.6 => /lib64/libc.so.6 (0x00007f81f961b000) libltdl.so.7 => /usr/local/lib/libltdl.so.7 (0x00007f81f940f000) /lib64/ld-linux-x86-64.so.2 (0x00007f81fa2ac000) 

Si aún estás atascado, es posible que desees volver a empezar desde cero siguiendo esta o esta respuesta.