web-dev-qa-db-fra.com

PyODBC: impossible d'ouvrir le pilote même s'il existe

Je suis nouveau dans le monde Linux et je veux interroger un serveur Microsoft SQL Server à partir de Python. Je l'ai utilisé sous Windows et c'était parfaitement correct, mais sous Linux, c'est assez pénible.

Après quelques heures, j'ai finalement réussi à installer le pilote Microsoft ODBC sur Linux Mint avec unixODBC.

Ensuite, j'ai créé un environnement anaconda avec python 3. 

Je fais alors ceci:

import pyodbc as odbc

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

Il retourne:

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

La chose que je ne comprends pas, c’est que PyODBC semble lire le bon chemin de fichier de odbcinst.ini et ne fonctionne toujours pas.

Je suis allé à "/opt/Microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0" et le fichier existe!

Alors pourquoi me dit-il qu'il n'existe pas? Voici quelques indices possibles:

  • Je suis sur un environnement virtuel
  • J'ai besoin des droits "en lecture" car c'est un chemin de fichier racine

Je ne sais comment résoudre aucun de ces problèmes.

Merci !

17
Joseph Yourine

J'ai également eu le même problème sur Ubuntu 14 après avoir suivi le tutoriel de Microsoft pour Pilote SQL Server Linux ODBC .

Le fichier existe et après avoir exécuté un ldd, il a montré qu'il manquait des dépendances:

/opt/Microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 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: versionCXXABI_1.3.8 'non trouvée (requis par 

après avoir cherché pendant un moment, j’ai trouvé que c’est parce que le référentiel d’Ubuntu n’avait pas GLIBCXX sur la version 3.4.20, c’était à 3.4.19.

J'ai ensuite ajouté un dépôt à Ubuntu, mis à jour et forcé à mettre à niveau 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

Problème résolu, testé avec isql:

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

Après cela, j’ai essayé d’essayer avec pdo_odbc (PHP), il m’a donné le même pilote non trouvé, erreur . Pour résoudre ce problème, j’ai dû créer un lien symbolique pour corriger libodbcinst.so.2:

Sudo ln -s /usr/lib64/libodbcinst.so.2 /lib/x86_64-linux-gnu/libodbcinst.so.2
13
RBarreto

J'ai trouvé une réponse qui fonctionne pour moi ici . Ceci est pour Python 2.7 (peut donc ne pas fonctionner pour ceux qui recherchent une solution pour Python 3.x).

La solution suggérée est de mettre à jour libgcc: 4.8.5-2 -> 5.2.0-0

Pour mettre à jour libgcc, utilisez cette commande

conda update libgcc
4
sanhitamj

J'ai eu le même problème 'fichier non trouvé (0) (SQLDriverConnect)' sur MAC OS avec le code suivant

cnxn = pyodbc.connect (' DRIVER = {pilote ODBC 13 pour SQL Server} ; SERVER = monServeurIP, 1433; DATABASE = monDBName; UID = sa; PWD = dbPassword')

après avoir googlé pendant deux jours, je ne peux pas résoudre le problème, ni même modifier les fichiers freetds.conf, odbcinst.ini et odbc.ini

enfin, j'ai trouvé la solution en remplaçantDRIVERvalue

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

Mon environnement de dev

  • MAC OS El Capitan
  • python 3.6.1 à Anaconda
2
Karen Chang

Les suggestions suivantes peuvent aider à résoudre le problème:

1
kenorb

Peut-être qu'il est un peu tard, mais je laisse ce script qui a fonctionné pour moi.

Mon problème était le même que le vôtre et j'ai testé toutes les options telles que changer l'emplacement du pilote, créer un lien symbolique, modifier les fichiers /etc/*.ini, etc ... rien ne fonctionnait.

Mon problème, exécuter python 3.6, le paquet pyodbc dans un conteneur docker d’Alpine était la bibliothèque libssl1.0.0

Ici vous trouverez mon script d’installation pour pyodbcImage du menu fixe Debian 8 (Alpine) en utilisant le pilote v13

DRIVER = {Pilote ODBC 13 pour SQL Server}

La commande que j'ai exécutée pour la connexion à la base de données était la suivante:

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)
1
nenetto

eu le même problème une fois .. 1.try conda update libgcc (car pyodbc est installé via pip et conda recherchent différentes versions du fichier ..) .. cela aurait pu être corrigé .....link: https://github.com/ContinuumIO/anaconda-issues/issues/1639 cherchez la réponse de Nehaljwani.

2. Vérifiez également le numéro de version du fichier odbc dans /etc/odbcinst.ini et /etc/odbc.ini ... les noms doivent correspondre, ainsi que le chemin du pilote.

0
Nikhil Dhara

Je résous ce problème après l'installation de libssl1.0.0. 

Tout d'abord, j'ai configuré ma chaîne de connexion de la manière suivante: 

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

Ensuite, j'ai installé libssl1.0.0:

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

Enfin, j'ai configuré les paramètres régionaux:

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

Après avoir suivi ces étapes, mon module python a pu trouver et se connecter à la base de données.

0
Anderson Ribeiro