pyODBC отказывается искать unixODBC, вместо этого ищет iODBC

Есть ли способ заставить pyODBC v3.0.10 искать драйвер unixODBC вместо драйвера iODBC, который он, кажется, хочет искать?

Насколько я понимаю, pyODBC v3.0.10 должен делать это по умолчанию, в то время как версии до v3.0.7 требовали ручного редактирования файла setup.py (см. ссылку здесь).

Еще одна подсказка: я запустил этот код, чтобы вывести список своих источников ODBC, и он ничего не вернул:

sources = pyodbc.dataSources()
dsns = list(sources.keys())
dsns.sort()
sl = []
for dsn in dsns:
    sl.append('%s [%s]' % (dsn, sources[dsn]))
print('\n'.join(sl))

Дополнительная информация

Я изо всех сил пытался создать соединение с MSSQL Server, используя следующую настройку: pyODBC --> unixODBC --> FreeTDS --> MS SQL. Подробности задокументированы здесь.

Я сузил его до конкретной проблемы (я думаю): пакет pyODBC ищет драйвер iODBC вместо драйвера unixODBC, который я установил и настроил. Я верю в это, потому что когда я запускаю:

import pyodbc

pyodbc.connect(
    'DRIVER=FreeTDS;'
    'SERVER=MyServerIP;'
    'PORT=1433;'
    'DATABASE= DatabaseName;'
    'UID=MyUsername;'
    'PWD=MyPassword')

Я получаю эту ошибку со ссылкой на отсутствие драйвера iODBC:

---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)
<ipython-input-12-607f0d66e615> in <module>()
      1 pyodbc.connect(
----> 2     'DRIVER=FreeTDS;'
      3     'SERVER= MyServerIP;'
      4     'PORT=1433;'
      5     'DATABASE= DatabaseName;'

Error: ('00000', '[00000] [iODBC][Driver Manager]dlopen(FreeTDS, 6): image not found (0) (SQLDriverConnect)')

Спасибо за любой свет, который вы можете пролить.


person RJH2    schedule 21.06.2016    source источник
comment
Я должен добавить две вещи: 1) я подтвердил хорошие установки unixODBC и FreeTDS, установив хорошие соединения с помощью команд isql и tsql из терминала, и 2) я воспроизвел эти результаты на трех разных компьютерах Mac.   -  person RJH2    schedule 22.06.2016
comment
Я полагаю, что ответил здесь на ваш другой вопрос: stackoverflow.com/questions/37933369/ В вашем pyodbc.connect() вам необходимо замените FreeTDS на {FreeTDS} и добавьте TDS_Version=7.2 в качестве параметра подключения.   -  person FlipperPA    schedule 23.06.2016
comment
Спасибо, но попробовал и та же ошибка. Кажется, он даже не оценивает файл конфигурации FreeTDS (/usr/local/etc/freetds.conf), потому что, похоже, не имеет значения, что там находится. Я получаю ту же ошибку, если я очищаю весь файл. По какой-то причине pyODBC не ищет unixODBC, как описано выше. Он даже не доходит до FreeTDS.   -  person RJH2    schedule 23.06.2016


Ответы (2)


Я считаю, что причина в том, что вы, возможно, скомпилировали pyodbc для использования iODBC (или, может быть, это значение по умолчанию). Если вы хотите убедиться, что вы создаете pyodbc для unixODBC, вы можете указать это непосредственно перед запуском setup.py build, как указано здесь (см. http://www.easysoft.com/developer/languages/python/pyodbc.html). , заголовок pyodbc 3.0.x). Кроме того, попробуйте следовать инструкциям здесь: https://code.google.com/archive/p/pyodbc/wikis/Building.wiki

person Yuval    schedule 23.06.2016
comment
У меня тоже есть такое подозрение, но проверить не могу. Устанавливаю pyodbc, через conda install pyodbc (Анаконда). Если бы он был скомпилирован неправильно, я ожидаю, что у многих людей возникнет эта проблема. Чтобы проверить это, мне нужно собрать пакет conda, что я не знаю, как это сделать. Наконец, когда я указываю путь к драйверу FreeTDS, он дает мне другая ошибка, указывающая на то, что даже если он находит unixODBC, проблема остается - person RJH2; 23.06.2016

Это репост моего ответа здесь, но это отвечает на более конкретную формулировку вопроса. Надеюсь, я не нарушаю никаких правил, но мне потребовалось несколько недель, чтобы понять это, и много народной помощи. Так что, если это дубликат вопросов и ответов, так тому и быть — мы это заслужили.

Что ж, мы решили эту проблему — с помощью многих людей на этой странице и в оригинале, отыскав множество тупиков.

Как (в конце концов) подозревали, это была ссылка pyodbc в соединении. Я использовал pyodbc v3.0.10, загрузив его из репозитория пакетов Anaconda. Решение было v.3.0.9. Как только я удалил v3.0.10, загрузил v3.0.9 из репозитория pypi, а затем собрал и установил свой собственный пакет conda... это сработало.

Шаги, которые я предпринял, были следующими (обратите внимание, что они были специфичны для среды anaconda):

conda uninstall pyodbc

conda skeleton pypi pyodbc --version 3.0.9

conda build pyodbc

conda install pyodbc=3.0.9 --use-local

Как только я вернулся к своему блокноту Jupyter и запустил тот же код выше, он установил хорошее соединение.

Я не знаю, что не так с v.3.0.10, или это просто файлы, которые есть в репозитории anaconda.org. Я также опубликовал кое-что на странице pyodbc github, но она не выглядит такой активной.

В любом случае, спасибо всем за помощь. Надеюсь, это сэкономит кому-то время.

person RJH2    schedule 29.06.2016