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

问题描述 投票:23回答:11

我正在尝试从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"
python database tsql database-connection pyodbc
11个回答
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

0
投票

一个设置就足够了,qazxsw poi:

/etc/odbcinst.ini

接下来:

[FreeTDS]
Description = FreeTDS Driver to MsSQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
UsageCount = 1

-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

10
投票

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

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

我在其他地方指定了它,但显然也需要在这里。

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


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>')

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文件。


3
投票

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

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


2
投票

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

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

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


2
投票

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.