Что вызывает «неспособность соединиться с источником данных» для pyodbc? - PullRequest
24 голосов
/ 15 марта 2012

Я пытаюсь подключиться к базе данных 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)')

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

Edit: Глядя на дамп журнала 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"

Ответы [ 11 ]

0 голосов
/ 11 мая 2016

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

Изменить 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)
...