python - example - PyODBC: no se puede abrir el controlador aunque exista
pyodbc sql server 2016 (7)
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 !
He encontrado una respuesta que funciona para mí here . 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
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
(verifiqueodbcinst.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 sulibgcc
ejecutando elconda 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 .
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.
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)
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 repositorio de Ubuntu no tenía GLIBCXX en la versión 3.4.20, estaba en 3.4.19.
Luego agregué un repositorio 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
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
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: here 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.