2016-01-14 3 views
13

Я новичок в мире Linux, и я хочу запросить Microsoft SQL Server с Python. Я использовал его в Windows, и это было прекрасно, но в Linux это довольно болезненно.PyODBC: не удается открыть драйвер, даже если он существует

Через несколько часов мне наконец удалось установить драйвер Microsoft ODBC на Linux Mint с помощью unixODBC.

Затем я создал anaconda с окружающей средой python 3.

Я тогда сделать это:

import pyodbc as odbc 

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

возвращает:

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

Дело не в том, что undertsand PyODBC, кажется, читает правильный путь файла от odbcinst.ini и до сих пор не работает ,

Я пошел в "/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0", и файл действительно существует!

Так почему это говорит мне, что его нет? Вот некоторые возможные подсказки:

  • Я на виртуальную среду
  • мне нужно иметь «читать» права, потому что это корень путь_к_файл

Я не знаю, как решить либо этих проблем.

Спасибо!

+0

Это может быть недостающая библиотека (библиотека, используемая libmsodbcsql-13.0.so.0.0) или проблема LD_LIBRARY_PATH. Не могли бы вы поделиться результатами следующей команды? 'ldd/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0' – mauro

+0

Связанный: [драйвер ODBC 13 для SQL Server не может открыть lib на pyodbc] (https://stackoverflow.com/q/41182415/ 55075). – kenorb

ответ

12

У меня также была та же проблема на Ubuntu 14 после выполнения руководства по Microsoft для SQL Server Linux ODBC Driver.

Файл существует и после запуска в LDD, он показал, были зависимости отсутствуют:

/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0:/USR/Библиотека/x86_64-linux- гну/libstdC++ so.6:. версия 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' не найден (требуется

после поиска на некоторое время я нашел его, потому что в Ubuntu репо не имели GLIBCXX на версии 3.4.20, это было в 3.4.19.

Затем я добавил репо к Ubuntu, обновил его и принудительно обновил 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 

Проблема решена, протестирована с ISQL:

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

После этого я попытался тестирования с помощью PDO_ODBC (PHP), он тогда дал мне тот же драйвер не найдена ошибка. Чтобы решить эту проблему, я должен был создать символическую ссылку, чтобы исправить libodbcinst.so.2:

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

Спасибо, я также воспользовался его решением. чем у меня проблема с подключением к моей базе данных, но это еще одна история. ! –

4

я нашел ответ, который работает для меня here. Это для python 2.7 (так что может не работать для тех, кто ищет решение для python 3.x).

Предлагаемое решение предназначено для обновления libgcc: 4.8.5-2 -> 5.2.0-0

Для обновления libgcc, используйте эту команду

conda update libgcc 
+0

Если вы перейдете по этой ссылке, вы получите ответ от nehalijwani, который отлично повторяет проблему и объясняет, почему обновление libgcc исправляет ее. Подводя итог: pyodbc.so требует libstdC++. Этот файл существует в conda, поэтому он использует эту версию вместо системной версии. К сожалению, libmsodbc.sql требует более поздней версии, чем установка conda по умолчанию. Поэтому обновление conda libgcc позволяет использовать локальную ссылку на версию conda. –

1

я такая же проблема 'файл не найден (0) (SQLDriverConnect)' на MAC OS с помощью следующего кода

CnXn = pyodbc.connect ('ВОДИТЕЛЬ = {Драйвер ODBC 13 для SQL Server}; SERVER = myServerIP, 1433; БАЗА ДАННЫХ = myDBName; UID = са; PWD = DBPassword')

после прибегая к помощи в течение двух дней, я не могу исправить этот вопрос даже изменить freetds.conf, odbcinst.ini и odbc.ini

наконец, я нашел решение по замене ВОДИТЕЛЯ значение

CnXn = pyodbc.connect ('ВОДИТЕЛЬ = {/ USR/местные/Библиотека/libmsodbcsql.13.dylib}; SERVER = myServerIP, 1433; БАЗА ДАННЫХ = myDBName; UID = са; PWD = DBPassword')

Моя DEV среда

  • MAC OS EI Capitan
  • питон 3.6.1 в Anconda
0

была такая же проблема раз .. 1.try обновление Конда libgcc (это происходит потому, что pyodbc установлен через pip и conda искать разные версии файла ..) .. это могло быть исправлено ..... ссылка: https://github.com/ContinuumIO/anaconda-issues/issues/1639 искать ответ нехалвани.

2. Также проверьте номер версии файла odbc правильно в /etc/odbcinst.ini и /etc/odbc.ini ... имена должны совпадать, а также путь к драйверу.

1

Следующие предложения могут помочь решить проблему:

  • Убедитесь, что конфигурация привода INI файл существует odbcinst -j (проверка odbcinst.ini).
  • Убедитесь, что путь к файлу указанному драйверу из вашего файла INI (run: odbcinst -j) существует и имеет флаги разрешения на чтение и выполнение (O_RDONLY|O_CLOEXEC).
  • Если вы все еще получили файла не найдены ошибки, несмотря на файл существует, то проблема может быть связана с libgcc несовпадения версий согласно nehaljwani's GitHub comment. Решение состоит в том, чтобы обновить libgcc, выполнив команду conda update libgcc.

    См. Также: ODBC Driver 13 for SQL Server can't open lib on pyodbc while connecting on AWS E2 ubuntu instance.

  • Для macOS см.: Installing ODBC via HomeBrew.

Смежные вопросы