PyODBC: no se puede abrir el controlador aunque exista

Soy nuevo en el mundo de Linux y quiero consultar un servidor Microsoft SQL de Python. Lo usé en Windows y estaba perfectamente bien, pero en Linux es bastante doloroso.

Después de algunas horas, finalmente pude instalar el controlador Microsoft ODBC en Linux Mint con unixODBC.

Entonces, instalé una anaconda con el ambiente de python 3.

Entonces hago esto:

import pyodbc as odbc sql_PIM = odbc.connect("Driver={ODBC Driver 13 for SQL Server};Server=XXX;Database=YYY;Trusted_Connection=Yes") 

Vuelve :

 ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0' : file not found (0) (SQLDriverConnect)") 

Lo que no entiendo es que PyODBC parece leer la ruta de archivo correcta de odbcinst.ini y aún no funciona.

Fui a “/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0” y el archivo realmente existe!

Entonces, ¿por qué me dice que no existe? Aquí hay algunas pistas posibles:

  • Estoy en un entorno virtual
  • Necesito tener derechos de “lectura” porque es una ruta de acceso raíz

No sé cómo resolver ninguno de estos problemas.

Gracias !

También tuve el mismo problema en Ubuntu 14 después de seguir el tutorial de Microsoft para el controlador ODBC de SQL para Linux Server .

El archivo existe y después de ejecutar un ldd, mostró que faltaban dependencias:

/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: versión GLIBCXX_3.4.20' not found (required by /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0) /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version CXXABI_1.8. no encontrado (requerido por

después de buscar por un tiempo encontré su porque el repository de Ubuntu no tenía GLIBCXX en la versión 3.4.20, estaba en 3.4.19.

Luego agregué un repository a Ubuntu, lo actualicé y lo forcé a actualizar libstdc ++ 6

 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get upgrade sudo apt-get install libstdc++6 

Problema resuelto, probado con isql:

 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> 

Después de eso, intenté realizar pruebas utilizando pdo_odbc (PHP), luego me dio el mismo error que no se encontró el controlador. Para resolver esto tuve que crear un enlace simbólico para arreglar libodbcinst.so.2 :

 sudo ln -s /usr/lib64/libodbcinst.so.2 /lib/x86_64-linux-gnu/libodbcinst.so.2 

He encontrado una respuesta que funciona para mí aquí . Esto es para Python 2.7 (por lo que puede que no funcione para aquellos que buscan una solución para Python 3.x).

La solución sugerida es actualizar libgcc: 4.8.5-2 -> 5.2.0-0

Para actualizar libgcc, usa este comando

 conda update libgcc 

Tuve el mismo problema ‘archivo no encontrado (0) (SQLDriverConnect)’ en MAC OS con el siguiente código

cnxn = pyodbc.connect (‘ DRIVER = {ODBC Driver 13 para SQL Server} ; SERVER = myServerIP, 1433; DATABASE = myDBName; UID = sa; PWD = dbPassword’)

después de buscar en Google durante dos días, no puedo solucionar el problema, incluso modificar los freetds.conf, odbcinst.ini y odbc.ini

Finalmente, encontré la solución al reemplazar el valor de DRIVER .

cnxn = pyodbc.connect (‘ DRIVER = {/ usr / local / lib / libmsodbcsql.13.dylib} ; SERVER = myServerIP, 1433; DATABASE = myDBName; UID = sa; PWD = dbPassword)

Mi entorno dev

  • MAC OS El Capitán
  • python 3.6.1 en anaconda

Las siguientes sugerencias pueden ayudar a resolver el problema:

  • Asegúrese de que exista el archivo INI de configuración de la unidad odbcinst -j (verifique odbcinst.ini ).
  • Asegúrese de que exista la odbcinst -j archivo al controlador configurado desde su archivo INI (ejecutar: odbcinst -j ) y que tenga banderas de permiso de lectura y ejecutables ( O_RDONLY|O_CLOEXEC ).
  • Si aún tiene un error de archivo no encontrado , a pesar de que el archivo existe, el problema podría estar relacionado con la libgcc coincidencia de la versión libgcc según el comentario de GitHub de Nehaljwani . La solución es actualizar su libgcc ejecutando el conda update libgcc .

    Relacionado: El controlador ODBC 13 para SQL Server no puede abrir lib en pyodbc mientras se conecta en la instancia de AWS E2 en ubuntu .

  • Para macOS, consulte: Instalación de ODBC a través de HomeBrew .

Tal vez sea un poco tarde, pero les dejo estos scripts que funcionaron para mí.

Mi problema fue el mismo que el tuyo y probé todas las opciones, como cambiar la ubicación del controlador, crear un enlace simbólico, modificar los archivos /etc/*.ini, etc … nada funcionó.

Mi problema, al ejecutar Python 3.6, el paquete pyodbc en un contenedor docker de alpine fue la biblioteca libssl1.0.0

Aquí encontrará mi script de instalación para la imagen de docker pyodbc Debian 8 (alpine) usando el controlador v13

DRIVER = {ODBC Driver 13 para SQL Server}

El comando que ejecuto para la conexión de la base de datos era:

 import pyodbc connection_string = 'DRIVER={ODBC Driver 13 for SQL Server};' connection_string += 'SERVER={0};DATABASE={1};UID={2};PWD={3};'.format(host,dbname,user,pwd) connection = pyodbc.connect(connection_string) 

tuve el mismo problema una vez … 1.try conda update libgcc (esto se debe a que pyodbc se instaló a través de pip y conda busca diferentes versiones del archivo …) .. esto podría haber sido corregido ….. enlace: https: / /github.com/ContinuumIO/anaconda-issues/issues/1639 busque la respuesta nehaljwani.

2. También verifique el número de versión del archivo odbc correctamente en /etc/odbcinst.ini y /etc/odbc.ini … los nombres deben coincidir y también la ruta del controlador.

Resuelvo este problema después de instalar libssl1.0.0.

Primero, configuro mi cadena de conexión de esta manera:

  cnxn = pyodbc.connect('DRIVER={/usr/local/lib/libmsodbcsql.13.dylib}; SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword') 

Entonces, instalé libssl1.0.0:

  echo "deb http://security.debian.org/debian-security jessie/updates main" >> /etc/apt/sources.list apt-get install libssl1.0.0 

Por último, configuro los locales:

  apt-get -y install locales echo "en_US.UTF-8 UTF-8" > /etc/locale.gen 

Después de hacer estos pasos, mi módulo de python pudo encontrar y conectarse a la base de datos.