我正在尝试从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"
我试着用:
这对我有用:
测试连接:
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
一个设置就足够了,qazxsw poi:
/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
经过几个小时的圈子,我发现我失踪的是
我的odbc.ini文件中的DSN中的TDS_Version = 8.0。
我在其他地方指定了它,但显然也需要在这里。
希望这有助于其他一些可怜的灵魂
我有同样的问题,我发现它在调用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>')
只是为了额外的数据点,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文件。
将TDS_Version添加到为我工作的连接字符串:
connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'
将我的ubuntu版本升级到12.04后,我也遇到了问题。我的旧freetds配置/etc/freetds/freetds.conf
没有找到所以我不得不把它移动到/usr/local/etc
,此时它又开始工作了。
我的司机位置也是/usr/local/lib/libtdsodbc.so
希望这有助于拯救某人一天半!
我的问题是,在我的设置文件中,我将HOST设置为SQL Server IP,但是经过几个小时的脱发后,我发现必须将HOST设置为数据源名称[]
您还可以在python脚本中设置环境变量:
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