【发布时间】:2016-10-22 08:23:10
【问题描述】:
尝试使用 pyODBC --> unixODBC --> FreeTDS --> MS SQL 堆栈在 python 中连接到 MS SQL 服务器时出现错误。我在这方面花了很多时间,如果您遇到这个问题更基本的问题是与工作 here 和 here 建立联系,那么这里有一些很好的资源。
但是,我的问题是关于(我认为)非常接近这种非常令人沮丧的体验的终点线的错误。具体来说,jupyter notebook 中的这段代码:
pyodbc.connect(
'DRIVER=/usr/local/lib/libtdsodbc.so;'
'SERVER=MyServerIP;'
'PORT=1433;'
'DATABASE= DatabaseName;'
'UID=MyUsername;'
'PWD=MyPassword')
给我这个错误:
---------------------------------------------------------------------------
Error Traceback (most recent call last)
<ipython-input-7-d6b29b647116> in <module>()
1 pyodbc.connect(
----> 2 'DRIVER = /usr/local/lib/libtdsodbc.so;'
3 'SERVER = MyServerIP;'
4 'PORT = 1433;'
5 'DATABASE = DatabaseName'
Error: ('HY000', '[] (20013) (SQLDriverConnect)’)
如果我替换 'DRIVER=/usr/local/lib/libtdsodbc.so;'使用“驱动程序=FreeTDS;”我明白了:
---------------------------------------------------------------------------
Error Traceback (most recent call last)
<ipython-input-12-607f0d66e615> in <module>()
1 pyodbc.connect(
----> 2 'DRIVER=FreeTDS;'
3 'SERVER= MyServerIP;'
4 'PORT=1433;'
5 'DATABASE= DatabaseName;'
Error: ('00000', '[00000] [iODBC][Driver Manager]dlopen(FreeTDS, 6): image not found (0) (SQLDriverConnect)')
这让我相信 unixODBC 有问题 --> FreeTDS 连接因为引用了 iODBC。换句话说,除非我专门提供 FreeTDS 驱动程序的路径,否则它似乎会忽略我的 odbcinst.ini 和 odbc.ini 文件,它们将 FreeTDS 及其位置作为我的驱动程序(见下文)
当从终端运行 tsql 和 isql 时,两者都会与服务器产生良好的连接。
但是,当我运行 osql 时,出现以下错误:
$ osql -S MyServerIP -U MyUsername -P MyPassword
checking shared odbc libraries linked to isql for default directories...
/usr/local/bin/osql: line 53: ldd: command not found
error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strings: can't open file: (No such file or directory)
osql: problem: no potential directory strings in "/usr/local/bin/isql"
osql: advice: use "osql -I DIR" where DIR unixODBC\'s install prefix e.g. /usr/local
isql strings are:
checking odbc.ini files
reading /Users/myname/.odbc.ini
[MyServerIP] not found in /Users/myname/.odbc.ini
cannot read "/odbc.ini"
osql: error: unable to locate MyServerIP in any odbc.ini
我的设置背景
我的连接是使用第一段中链接的两个资源建立(并重建和重建)的,我的完整设置如下所示:
环境
Mac OSX 10.11.5
Microsoft SQL Server 2012 – AWS EC2 实例(云)
Anaconda 4.0
Python 3.5.1
Jupyter Notebook 4.1.0
连接堆栈
unixODBC – 使用自制软件安装
FreeTDS – 使用 homebrew 命令安装:`$ brew install
freetds --with-unixodbc`
pyODBC 3.0.10 – 使用 conda install 安装
MS SQL – AWS EC2 实例(云)
参考文件
我的 freetds.conf 文件如下所示:
[MYSERVERNAME]
host = MyServerIP
port = 1433
tds version = 7.3
client charset = UTF-8
我的 odbcinst.ini 文件如下所示:
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtdsodbc.so
FileUsage = 1
我的 odbc.ini 文件如下所示:
[MYSERVERNAME]
Driver = FreeTDS
Server = MyServerIP
Port = 1433
我完全不知所措,我花了比我应该花的时间多得多的时间。如果有人有任何建议,我将永远感激不尽。
谢谢。
【问题讨论】:
-
查看my answer 对另一个问题是否有帮助 - 并尝试 TDS 版本 = 8.0...
-
感谢@BennyHill,严格按照链接中的说明操作导致我无法通过 isql 命令建立连接。如上所述,我的 tsql 和 isql 测试都创建了连接。我越来越相信这与 pyODBC --> unixODBC 连接失败有关。但不知道是什么。
-
两件事,(1) 请在您的 pyodbc.connect() 中使用
DRIVER={FreeTDS}和 (2) 不要使用 TDS 8.0 版本,它不是真正的 TDS 版本。见:freetds.org/userguide/choosingtdsprotocol.htm -
进行了您建议的更改,但没有任何乐趣。正如我在下面的评论中一样,而且还在 FreeTDS 周围添加了大括号。同样的错误:
Error: ('00000', '[00000] [iODBC][Driver Manager]dlopen({FreeTDS}, 6): image not found (0) (SQLDriverConnect)')
标签: python sql-server pyodbc freetds unixodbc