当尝试使用 pyODBC --> unixODBC --> FreeTDS --> MS SQL 堆栈在 python 中连接到 MS SQL 服务器时,出现错误。我在这个问题上花了很多时间,如果您遇到这个问题并解决与工作建立联系的更基本问题,这里有一些很棒的资源here and here.
然而,我的问题是关于一个错误,(我认为)该错误非常接近这次非常令人沮丧的经历的终点线。具体来说,jupyter笔记本中的这段代码:
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;'与 'DRIVER=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)')
这让我相信由于引用了 iODBC,unixODBC --> FreeTDS 连接出现了问题。换句话说,除非我专门提供 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 OS X 10.11.5
Microsoft SQL Server 2012 – AWS EC2 实例(云)
蟒蛇4.0
Python 3.5.1
Jupyter笔记本4.1.0
连接栈
unixODBC – 使用自制软件安装
FreeTDS – 使用自制程序安装,命令为:`$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
我完全不知所措,在这上面花了比我应该花的时间多得多的时间。如果有人有任何建议,我将永远感激不已。
Thanks.