Что вызывает невозможность подключения к источнику данных для pyodbc?

Я пытаюсь подключиться к базе данных MSSQL из Python в Linux (SLES).

Я установил pyodbc и Free TDS. Из командной строки:

tsql -H server -p 1433 -U username -P password

Однако без проблем подключается к серверу из Python:

import pyodbc
pyodbc.connect(driver='{FreeTDS}', server='server', database='database', uid='username', pwd='password')

Выдает ошибку:

pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')

Я считаю эту ошибку бесполезно расплывчатой. Даже предложение сузить круг вопросов было бы полезно прямо сейчас.

Изменить: глядя на дамп журнала TDS, похоже, что здесь все разваливается:

token.c:328:tds_process_login_tokens()
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20017, 115)
odbc.c:2270:msgno 20017 20003
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
util.c:156:Changed query state from IDLE to DEAD
token.c:337:looking for login token, got  0()
token.c:122:tds_process_default_tokens() marker is 0()
token.c:125:leaving tds_process_default_tokens() connection dead
login.c:466:login packet accepted
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20002, 0)
odbc.c:2270:msgno 20002 20003
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
mem.c:615:tds_free_all_results()
error.c:412:odbc_errs_add: "Unable to connect to data source"

person pbaehr    schedule 15.03.2012    source источник


Ответы (13)


Я пробую:

  • Центр обработки данных MS SQL 2008
  • Ubuntu 12.04 TLS (amd64)
  • Python 2.7

И это работает для меня:

Тестовое соединение:

tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456

в /etc/odbcinst.ini добавьте:

[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup =  /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1

в /etc/odbc.ini добавьте:

[SQLDemo]
Description=my dsn
Driver=FreeTDS
Database=teste3
Servername=SQLDemo

в /etc/freetds/freetds.conf добавьте:

[SQLDemo]
        host = 10.19.4.42
        port = 1433
        tds version = 8.0

тест с test.py:

#!/usr/bin/python

import pyodbc
cnx = pyodbc.connect("DSN=SQLDemo;UID=DAVIDG;PWD=123456")

cursor = cnx.cursor()
cursor.execute("select * from Company;")
for row in cursor:
  print row.Name
person José Ibañez    schedule 08.08.2012
comment
Одна из очень полезных команд для получения сведений о сервере - это tsql -LH hostname. - person FUD; 02.02.2013
comment
Очень полезный ответ. Большое спасибо! :) - person user1158559; 11.08.2015

У меня была та же проблема, и я обнаружил, что в вызове connect() отсутствует параметр TDS_Version. Следующий код работает для меня для подключения к экземпляру MS SQL Server 2008:

import pyodbc

driver = '/opt/local/lib/libtdsodbc.so' # Change this to where FreeTDS installed the driver libaray!

conn = pyodbc.connect(
    driver = driver,
    TDS_Version = '7.2', # Use for
    server = '<hostname or ip address>',
    port = 1433,
    database = '<database>',
    uid = '<uid>',
    pwd = '<pwd>')
person Feuermurmel    schedule 11.09.2012
comment
Почему этот синтаксис ключевого слова подключения не упоминается в вики ?! Возраст отладки среды Linux с помощью UnixODBC и FreeTDS, и это то, что работает. - person Felix; 15.08.2018

После нескольких часов хождения по кругу выясняется, что все, что мне не хватало, было

TDS_Version = 8.0 в DSN в моем файле odbc.ini.

Я указал это в другом месте, но, очевидно, он тоже должен был быть здесь.

Надеюсь, это поможет какой-нибудь другой бедной душе.

person pbaehr    schedule 18.03.2012

Добавление TDS_Version в строку подключения сработало для меня:

connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'

person cadizm    schedule 22.08.2015

Просто для дополнительной точки данных odbc.ini на моем хосте пуст, а odbcinst.ini содержит следующие строки:

# Driver from FreeTDS
#
[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so.0

наконец, файл freetds.conf имеет следующие строки:

[global]
    host= <hostname>
    port= <mssql port>
    tds version = 8.0

Конечно, можно указать настройки параметров в odbc.ini, но это позволяет управлять всеми параметрами конфигурации там, где вы их ожидаете, - в файле freetds.conf.

person Keith Schoenefeld    schedule 16.03.2012
comment
Интересный. У меня была версия tds, установленная на 8.0 в моем freetds.conf, как в глобальном, так и в каждом отдельном DSN. По какой-то причине он работал только после того, как был добавлен в другое место. - person pbaehr; 18.03.2012
comment
Вау, я столкнулся с той же проблемой. В Python это не работало, пока я вручную не добавил tds version = 8.0 в файл freetds.conf. Несмотря на то, что в комментариях к этому файлу говорится, что это не имеет отношения к делу, и по умолчанию он закомментирован:! - person Darren Ringer; 02.03.2015

Моя проблема заключалась в том, что в моем файле настроек я устанавливал HOST на IP-адрес SQL Server, однако после нескольких часов работы я понял, что HOST должен быть установлен на имя источника данных []

person Andres    schedule 08.12.2016

У меня также были проблемы с этим после обновления моей версии ubuntu до 12.04. Моя старая конфигурация freetds /etc/freetds/freetds.conf не была найдена, поэтому мне пришлось переместить ее в /usr/local/etc, после чего она снова начала работать.

Также мой водитель находится /usr/local/lib/libtdsodbc.so

Надеюсь, это поможет кому-то спасти полтора дня!

person Ben Ford    schedule 18.05.2012

Вы также можете установить переменную окружения в своем скрипте Python:

os.environ['TDSVER'] = '8.0'
person Pathead    schedule 01.01.2018

Одной настройки достаточно, /etc/odbcinst.ini:

[FreeTDS]
Description = FreeTDS Driver to MsSQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
UsageCount = 1

А дальше:

connection = pyodbc.connect(
    'DRIVER=FreeTDS;'
    'SERVER=<host_name_or_ip>;'
    'PORT=1433;'
    'DATABASE=<database>;'
    'UID=<username>;'
    'PWD=<password>;'
    'TDS_VERSION=8.0;'
)
person Vadim    schedule 19.04.2019

В моем случае мои файлы хоста отсутствуют, когда я пингуюсь на этот сервер, он не пингуется. Затем я заметил, что мои файлы хоста отсутствуют, применив команду sudo vi / etc / hosts в терминале. Я добавил свой хост и IP-адрес, и у меня все заработало.

person saichand    schedule 18.03.2020

Это сработало для меня, не уверен, но подумал, что это может кому-то помочь

запустите команду ниже, чтобы узнать, какую версию odbcinst и isql вы используете

 which odbcinst

 which isql

Затем запустите $ odbcinst -j, чтобы узнать, какие odbc.ini и odbcinst.ini используются.

В odbcinst.ini добавить

[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1

И в odbc.ini настройте свой сервер как

[YOUR_SERVER]
Driver = FreeTDS
Servername = <YOUR_MACHINE_NAME>
Database = <Database_You_Want_To_Connect>

Я нашел хорошее описание на https://docs.snowflake.net/manuals/user-guide/odbc-linux.html#unixodbc.

Также обратите внимание на https://github.com/lionheart/django-pyodbc/wiki/Mac-setup-to-connect-to-a-MS-SQL-Server

person Community    schedule 12.03.2018

Я нашел свой путь сюда после того, как обновление Ubuntu 18.04 сломало мои соединения pyodbc. Оказывается, в моем файле //etc/odbcinst.ini порядок описания драйверов был изменен.

Итак, когда я позвонил:

from pyodbc import connect,drivers
conn = connect(driver=drivers()[0], ...

Я должен был позвонить:

conn = connect(driver=drivers()[1], ...  

Другими словами, я звонил не тому драйверу из-за простой проблемы с индексом. Надеюсь, это поможет кому-то другому.

person ChrisDanger    schedule 24.08.2020

Для меня сработало следующее:

Изменить python2.7/site-packages/sql_server/pyodbc/base.py

def get_new_connection(self, conn_params):
...
-    cstr_parts['SERVERNAME'] = host
+    cstr_parts['SERVER'] = host
+    cstr_parts['PORT'] = str(port)
person Cody    schedule 11.05.2016