是什么导致pyodbc"无法连接到数据源"?

pba*_*ehr 25 python t-sql database database-connection pyodbc

我正在尝试从Linux上的python(SLES)连接到MSSQL数据库.

我安装了pyodbc和Free TDS.从命令行:

tsql -H server -p 1433 -U username -P password
Run Code Online (Sandbox Code Playgroud)

但是,从Python连接到服务器没有问题:

import pyodbc
pyodbc.connect(driver='{FreeTDS}', server='server', database='database', uid='username', pwd='password')
Run Code Online (Sandbox Code Playgroud)

产生错误:

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

我发现这个错误无益于模糊.即使是缩小问题范围的建议也会有所帮助.

编辑:看看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"
Run Code Online (Sandbox Code Playgroud)

Jos*_*ñez 19

我试着用:

  • MS SQL 2008 Datacenter
  • Ubuntu 12.04 TLS(amd64)
  • Python 2.7

这对我有用:

测试连接:

tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456
Run Code Online (Sandbox Code Playgroud)

在/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
Run Code Online (Sandbox Code Playgroud)

在/etc/odbc.ini上添加:

[SQLDemo]
Description=my dsn
Driver=FreeTDS
Database=teste3
Servername=SQLDemo
Run Code Online (Sandbox Code Playgroud)

在/etc/freetds/freetds.conf上添加:

[SQLDemo]
        host = 10.19.4.42
        port = 1433
        tds version = 8.0
Run Code Online (Sandbox Code Playgroud)

用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
Run Code Online (Sandbox Code Playgroud)

  • 了解服务器详细信息的一个非常有用的命令是**tsql -LH hostname**. (4认同)

Feu*_*mel 13

我有同样的问题,我发现它TDS_Version在调用中缺少参数connect().以下代码适用于我连接到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>')
Run Code Online (Sandbox Code Playgroud)

  • 为什么Wiki中未提及此连接关键字语法?使用UnixODBC和FreeTDS调试Linux环境的时代已经来临。 (2认同)

pba*_*ehr 10

经过几个小时的圈子,我发现我失踪的是

我的odbc.ini文件中的DSN中的TDS_Version = 8.0.

我已经在其他地方指定了它,但它显然也必须在这里.

希望这有助于其他一些可怜的灵魂


小智 5

将 TDS_Version 添加到连接字符串对我有用:

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