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

时间:2012-03-15 16:09:33

标签: python database tsql database-connection pyodbc

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

我安装了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"

13 个答案:

答案 0 :(得分:18)

我尝试:

  • MS SQL 2008 Datacenter
  • 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

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:9)

我遇到了同样的问题,我发现它在调用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>')

答案 3 :(得分:4)

对于额外的数据点,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文件。

答案 4 :(得分:3)

将TDS_Version添加到为我工作的连接字符串中:

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

答案 5 :(得分:2)

将我的ubuntu版本升级到12.04后,我也遇到了问题。我的旧freetds配置/etc/freetds/freetds.conf没有找到,因此我不得不将其移至/usr/local/etc,此时它又重新开始工作。

我的司机位置也是/usr/local/lib/libtdsodbc.so

希望这有助于拯救某人一天半!

答案 6 :(得分:2)

我的问题是,在我的设置文件中,我将HOST设置为SQL Server IP,但是经过几个小时的脱发后,我发现HOST必须设置为数据源名称[]

答案 7 :(得分:1)

在我的情况下,当我ping到未ping通的服务器时,我的主机文件丢失了。然后我通过在终端中应用sudo vi / etc / hosts命令注意到我的主机文件丢失了。我添加了主机和IP地址,并为我工作正常。

答案 8 :(得分:0)

您还可以在python脚本中设置环境变量:

AsyncTask

答案 9 :(得分:0)

这对我有用,不确定,但认为它可以帮助某人

运行以下命令以查找您正在使用的odbcinst和isql版本

 which odbcinst

 which isql

然后运行$ odbcinst -j以查找正在使用的odbc.iniodbcinst.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

答案 10 :(得分:0)

其中一项是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;'
)

答案 11 :(得分:0)

在Ubuntu 18.04升级中断了我的pyodbc连接之后,我在这里找到了自己的出路。原来,在我的//etc/odbcinst.ini文件中,我的驱动程序描述顺序已更改。

所以当我打电话给我时:

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

我应该一直在打电话:

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

换句话说,由于一个简单的索引问题,我调用了错误的驱动程序。希望这对其他人有帮助。

答案 12 :(得分:-1)

以下为我工作:

修改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)