Python 什么';s导致';无法连接到数据源';为了pyodbc?

Python 什么';s导致';无法连接到数据源';为了pyodbc?,python,database,tsql,database-connection,pyodbc,Python,Database,Tsql,Database Connection,Pyodbc,我正在尝试从Linux上的python(SLES)连接到MSSQL数据库 我已经安装了pyodbc和免费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'

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

我已经安装了pyodbc和免费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"

仅针对一个额外的数据点,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
[全球]
主机=
端口=
tds版本=8.0

虽然可以在odbc.ini中指定选项设置,但这样做可以让配置选项都在您期望的地方进行管理,即freetds.conf文件。

经过几个小时的循环,我发现我所缺少的是

TDS_版本=8.0 在我的odbc.ini文件的DSN中

我已经在别处指定了它,但显然它也需要在这里


希望这能帮助其他可怜的人。

在将ubuntu版本升级到12.04之后,我也遇到了这个问题。我的旧freetds config
/etc/freetds/freetds.conf
找不到,所以我不得不将它移动到
/usr/local/etc
,这时它又开始工作了

另外,我的驱动程序位置是
/usr/local/lib/libtdsodbc.so

希望这能帮你节省一天半的时间

我尝试:

  • 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

我也遇到了同样的问题,我发现调用
connect()
时缺少
TDS\u 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>')
导入pyodbc
driver='/opt/local/lib/libtdsodbc.so'#将此更改为FreeTDS安装驱动程序libaray的位置!
conn=pyodbc.connect(
驾驶员=驾驶员,
TDS#U版本='7.2',#用于
服务器=“”,
端口=1433,
数据库=“”,
uid=“”,
pwd=“”)

将TDS\U版本添加到连接字符串对我来说很有效:


connection_string='DRIVER={{FreeTDS};服务器={SERVER};端口=1433;数据库={DATABASE};UID={UID};PWD={PWD};TDS_VERSION=8.0'

以下内容适用于我:

修改
python2.7/site packages/sql\u server/pyodbc/base.py

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

我的问题是,在我的设置文件中,我将主机设置为SQL Server IP,但在数小时的紧张工作后,我发现主机必须设置为数据源名称[]

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

os.environ['TDSVER'] = '8.0'

这对我来说很有效,但我不确定,但我认为这可能会对某些人有所帮助

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

 which odbcinst

 which isql
然后运行
$odbcinst-j
以查找正在使用的
odbc.ini
odbcinst.ini

odbcinst.ini中
add

[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>
[您的_服务器]
驾驶员=自由驾驶
服务器名=
数据库=
我在网站上找到了一些很好的描述


还可以查看一个设置是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;'
)
connection=pyodbc.connect(
'DRIVER=FreeTDS;'
'服务器=;'
'端口=1433;'
'数据库=;'
“UID=;”
“PWD=;”
“TDS_版本=8.0;”
)

在我的情况下,当我ping到该服务器时,主机文件丢失,而该服务器没有ping。然后我注意到在终端中应用sudo vi/etc/hosts命令时主机文件丢失了。我添加了我的主机和ip地址,效果很好。

在Ubuntu 18.04升级中断了我的pyodbc连接后,我找到了自己的方法。事实证明,在我的//etc/odbcinst.ini文件中,我的驱动程序描述顺序被切换

所以当我打电话时:

from pyodbc import connect,drivers
conn = connect(driver=drivers()[0], ...
我应该打电话给:

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

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

有趣。在我的freetds.conf中,无论是在全局还是每个单独的DSN下,我都将tds版本设置为8.0。出于某种原因,它只有在被添加到其他位置后才起作用。哇,我刚刚经历了完全相同的问题。直到我手动将tds version=8.0添加到freetds.conf文件中,它才在Python中工作。即使该文件中的注释说它不相关,并且默认情况下已注释掉:!了解服务器详细信息的一个非常有用的命令是tsql-LH hostname。非常有用的答案。非常感谢!:)为什么wiki中没有提到这个连接关键字语法?!使用UnixODBC和FreeTDS调试Linux环境已经有很多年了,而这正是可行的。