Ответ 1
После нескольких часов в кругах выясняется, что мне не хватало
TDS_Version = 8.0 в DSN в моем файле odbc.ini.
Я указал его в другом месте, но он тоже должен был быть здесь.
Надеюсь, это поможет другой плохой душе.
Я пытаюсь подключиться к базе данных 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"
После нескольких часов в кругах выясняется, что мне не хватало
TDS_Version = 8.0 в DSN в моем файле odbc.ini.
Я указал его в другом месте, но он тоже должен был быть здесь.
Надеюсь, это поможет другой плохой душе.
Я пытаюсь:
И это работает для меня:
Тестовое соединение:
tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456
on/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
on/etc/odbc.ini добавить:
[SQLDemo]
Description=my dsn
Driver=FreeTDS
Database=teste3
Servername=SQLDemo
on/etc/freetds/freetds.conf добавить:
[SQLDemo]
host = 10.19.4.42
port = 1433
tds version = 8.0
test with 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
У меня была та же проблема, и я узнал, что в вызове 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>')
Только для дополнительного datapoint odbc.ini пуст на моем хосте, а odbcinst.ini имеет следующие строки:
# Driver from FreeTDS
#
[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so.0
last, файл freetds.conf имеет следующие строки:
[global]
host= <hostname>
port= <mssql port>
tds version = 8.0
В то время как в odbc.ini можно указать параметры параметров, таким образом это позволяет всем параметрам конфигурации управлять, где вы ожидаете их - файл freetds.conf.
Добавление TDS_Version к строке подключения, работающей для меня:
connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'
У меня также были проблемы с этим после обновления моей версии ubuntu до 12.04. Мой старый freetds config /etc/freetds/freetds.conf
не был найден, поэтому мне пришлось переместить его на /usr/local/etc
, после чего он снова начал работать.
Также расположение моего драйвера /usr/local/lib/libtdsodbc.so
Надеюсь, это поможет спасти кого-то полтора дня!
Моя проблема заключалась в том, что в моем файле настроек я устанавливал HOST на IP-адрес SQL Server, однако после нескольких часов вытягивания волос я выяснил, что HOST должен быть установлен на имя источника данных []
Вы также можете установить переменную окружения в свой python script:
os.environ['TDSVER'] = '8.0'
Это сработало для меня, не уверен, но подумал, что это может помочь кому-то
выполните команду ниже, чтобы узнать, какую версию 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
Один параметр - enoug, /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;'
)
Следующее работало для меня:
Изменить 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)