2016-01-14 16 views
13

Jestem nowy w świecie linux i chcę zapytać o serwer Microsoft SQL Server z Pythona. Używałem go w systemie Windows i było idealnie, ale w Linuksie to dość bolesne.PyODBC: nie można otworzyć sterownika, nawet jeśli istnieje

Po kilku godzinach w końcu udało mi się zainstalować sterownik Microsoft ODBC w systemie Linux Mint przy użyciu unixODBC.

Następnie ustawiłem anakondę w środowisku Pythona 3.

I wtedy to zrobić:

import pyodbc as odbc 

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

Zwraca:

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

Rzecz nie undertsand że pyodbc wydaje się odczytać właściwą filepath od ODBCINST.INI i nadal nie działa .

Poszedłem do "/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0", a plik faktycznie istnieje!

Dlaczego więc mówi mi, że nie istnieje? Oto kilka możliwych wskazówek:

  • Jestem w środowisku wirtualnym
  • muszę mieć „czytać” prawa, ponieważ jest to filepath korzeń

nie wiem jak rozwiązać albo tych problemów.

Dzięki!

+0

Może to być brakująca biblioteka (biblioteka używana przez libmsodbcsql-13.0.so.0.0) lub problem LD_LIBRARY_PATH. Czy możesz podzielić się wynikiem następującego polecenia? 'ldd/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0' – mauro

+0

Powiązane: [Sterownik ODBC 13 dla SQL Server nie może otworzyć biblioteki na pyodbc] (https://stackoverflow.com/q/41182415/ 55075). – kenorb

Odpowiedz

12

Też miałem ten sam problem na Ubuntu 14 po wykonaniu samouczka microsoft dla SQL Server Linux ODBC Driver.

Plik istnieje, Po uruchomieniu ldd, pokazała było zależności brakujące:

/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0:/usr/lib/x86_64-linux- gnu/libstdC++. so.6: wersja 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.3.8 "nie znaleziono (wymagane przez

po poszukiwaniach przez chwilę znalazłem, ponieważ repozytorium Ubuntu nie miało GLIBCXX na wersji 3.4.20, było na 3.4.19.

Dodałem następnie repo do Ubuntu, zaktualizowałem i zmusiłem do aktualizacji 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 

Problem rozwiązany, przetestowane z isql:

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

Po tym Próbowałem testowania przy użyciu pdo_odbc (PHP), to wtedy dał mi ten sam sterownik nie znaleziono błąd. Aby rozwiązać ten problem musiałem utworzyć dowiązanie symboliczne naprawić libodbcinst.so.2:

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

Dzięki, ja też fount jego rozwiązanie. niż mam problem z połączeniem z moją bazą danych, ale to już inna historia. ! –

4

znalazłem odpowiedź, która pracuje dla mnie here. To jest dla Pythona 2.7 (więc może nie działać dla tych, którzy szukają rozwiązania dla Pythona 3.x).

Zalecanym rozwiązaniem jest aktualizacja libgcc: 4.8.5-2 -> 5.2.0-0

Do aktualizacji libgcc użyj polecenia

conda update libgcc 
+0

Jeśli podążysz za tym linkiem, otrzymasz odpowiedź od nehalijwani, która doskonale ponownie wygeneruje problem i wyjaśnia, dlaczego aktualizacja libgcc go naprawia. Podsumowując: pyodbc.so wymaga libstdC++. So. Ten plik istnieje w conda, więc używa tej wersji zamiast wersji systemu. Niestety, libmsodbc.sql wymaga późniejszej wersji niż domyślnie instaluje się Conda. Dlatego aktualizacja conda libgcc pozwala na lokalne odwoływanie się do wersji conda. –

1

miałem ten sam problem 'File not found (0) (SQLDriverConnect)' na Mac OS z następującego kodu

cnxn = pyodbc.connect ('driver = {ODBC 13 SQL Server}; serwer = myServerIP, 1433; danych = myDBName; UID = SA PWD = hasło_bazy_danych')

po googlowania na dwa dni, nie mogę rozwiązać problem nawet modyfikować freetds.conf, ODBCINST.INI i ODBC.INI

wreszcie znalazłem rozwiązanie poprzez zastąpienie STEROWNIKA wartość

cnxn = pyodbc.connect ('driver = {/ usr/local/lib/libmsodbcsql.13.dylib}; Serwer = myServerIP, 1433; danych = myDBName; UID = SA PWD = hasło_bazy_danych')

Moje środowisko dev

  • MAC OS El Capitan
  • Python 3.6.1 w Anconda
0

miał ten sam problem raz .. 1.try aktualizacji Conda libgcc (To dlatego pyodbc zainstalowany przez PIP i conda szukają różnych wersji pliku.) .. To mogło być naprawione ..... link: https://github.com/ContinuumIO/anaconda-issues/issues/1639 szukać odpowiedzi nehaljwani.

2.Also również sprawdź numer wersji pliku odbc poprawnie w /etc/odbcinst.ini i /etc/odbc.ini ... nazwy powinny się zgadzać, a także ścieżkę sterownika.

1

Poniższe sugestie mogą pomóc w rozwiązaniu problemu:

Powiązane problemy