我正在尝试从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"
答案 0 :(得分:18)
我尝试:
这对我有用:
测试连接:
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.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
答案 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)