使用 pyODBC、unixODBC 和 FreeTDS 连接到 MS SQL 服务器时出错(在 Mac 上)
Error connecting to MS SQL Server using pyODBC, unixODBC and FreeTDS (on a Mac)
尝试连接到 python 中的 MS SQL 服务器时出现错误,使用 pyODBC --> unixODBC --> FreeTDS --> MS SQL堆。我在这上面花了很多时间,如果你遇到这个问题时遇到了更基本的连接工作问题 here and 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=FreeTDS;' 替换 'DRIVER=/usr/local/lib/libtdsodbc.so;' 我得到:
---------------------------------------------------------------------------
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 及其位置作为我的驱动程序(见下文)
当从终端 运行ning 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 实例(云)
蟒蛇 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
我完全不知所措,在这上面花费的时间远远超过我应该花的时间。如果有人有任何建议,我将永远感激不已。
谢谢。
你的问题中有很多变化的部分。您不仅有 Notebook-on-Python-on-ODBC,而且还有 iODBC 和 OS X。哎呀!
问题归结为:iODBC在哪里寻找odbc.ini
?我不知道报告该信息的 ODBC 函数。
因为它太复杂了,我建议使用 OS X dtruss(1)。将输出捕获到一个文件,并为 odbc.ini and/or open 命令进行 grep。一旦你知道它在哪里,你就可以把你的文件放在那里,然后按照指示去做。 ;-)
osql 脚本不能在 OS X 上运行的原因是没有人愿意让它运行,也没有人在 FreeTDS 上抱怨过它邮件列表。第一条消息很奇怪:
/usr/local/bin/osql: line 53: ldd: command not found
我用
解决了这个问题
$ command -V ldd
ldd is aliased to `otool -L'
这可能会有所帮助。 OTOH,脚本是用 unixODBC 编写的,因为它更受欢迎。
这是一个我认为对您有用的示例。如果您使用的是 FreeTDS 0.95,则可以使用 TDS 版本 7.3,如果您使用的是 0.82 或更低版本,则使用 7.1。我从来没有费心用这个堆栈测试 osql
,如果 tsql
和 isql
工作,你应该能够让其余的工作,但是配置和连接的细微差别很棘手:
freetds.conf:
[MYSERVERNAME]
host = MYSERVERNAME.host.com
port = 1433
tds version = 7.2
odbc.ini:
[MYSERVERNAME]
Driver = FreeTDS
Server = MYSERVERNAME.host.com
Port = 1433
TDS_Version = 7.2
odbcinst.ini:
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
在Python中:
connection = pyodbc.connect(r'DRIVER={FreeTDS};SERVER=MYSERVERNAME.host.com;PORT=1433;DATABASE=Database name;UID=Database Username;PWD=DatabasePasswd;TDS_Version=7.2')
TDS 8.0 版不存在。 7.2 是 FreeTDS 0.91 中支持的最高版本。混淆解释见这里:http://www.freetds.org/userguide/choosingtdsprotocol.htm
如果仍有问题,请尝试使用 tsql
和 isql
分别测试连接堆栈的 FreeTDS 和 unixODBC 层。祝你好运!
好吧,我们解决了这个问题——在这个页面和其他页面上的很多人的帮助下 ,追寻了很多死胡同。
正如(最终)怀疑的那样,它是连接中的 pyodbc link。我正在使用 pyodbc v3.0.10,通过从 Anaconda 包存储库下载。解决方案是 v.3.0.9。一旦我卸载了 v3.0.10,从 pypi 存储库下载了 v3.0.9,然后构建并安装了我自己的 conda 包……它成功了。
我采取的步骤如下(注意这些是特定于 anaconda 环境的):
conda uninstall pyodbc
conda skeleton pypi pyodbc --version 3.0.9
conda build pyodbc
conda install pyodbc=3.0.9 --use-local
一旦我回到我的 Jupyter notebook 和 运行 上面的相同代码,它就建立了良好的连接。
我不知道 v.3.0.10 有什么问题,或者只是 anaconda.org 在其存储库中的文件有问题。我也在 pyodbc github 页面上发布了一些内容,但它看起来并不那么活跃。
总之,谢谢大家的帮助。我希望这可以节省一些时间。
只需卸载 pyodbc 并重新安装它就解决了我的问题。
尝试连接到 python 中的 MS SQL 服务器时出现错误,使用 pyODBC --> unixODBC --> FreeTDS --> MS SQL堆。我在这上面花了很多时间,如果你遇到这个问题时遇到了更基本的连接工作问题 here and 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=FreeTDS;' 替换 'DRIVER=/usr/local/lib/libtdsodbc.so;' 我得到:
---------------------------------------------------------------------------
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 及其位置作为我的驱动程序(见下文)
当从终端 运行ning 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 实例(云)
蟒蛇 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
我完全不知所措,在这上面花费的时间远远超过我应该花的时间。如果有人有任何建议,我将永远感激不已。
谢谢。
你的问题中有很多变化的部分。您不仅有 Notebook-on-Python-on-ODBC,而且还有 iODBC 和 OS X。哎呀!
问题归结为:iODBC在哪里寻找odbc.ini
?我不知道报告该信息的 ODBC 函数。
因为它太复杂了,我建议使用 OS X dtruss(1)。将输出捕获到一个文件,并为 odbc.ini and/or open 命令进行 grep。一旦你知道它在哪里,你就可以把你的文件放在那里,然后按照指示去做。 ;-)
osql 脚本不能在 OS X 上运行的原因是没有人愿意让它运行,也没有人在 FreeTDS 上抱怨过它邮件列表。第一条消息很奇怪:
/usr/local/bin/osql: line 53: ldd: command not found
我用
解决了这个问题$ command -V ldd
ldd is aliased to `otool -L'
这可能会有所帮助。 OTOH,脚本是用 unixODBC 编写的,因为它更受欢迎。
这是一个我认为对您有用的示例。如果您使用的是 FreeTDS 0.95,则可以使用 TDS 版本 7.3,如果您使用的是 0.82 或更低版本,则使用 7.1。我从来没有费心用这个堆栈测试 osql
,如果 tsql
和 isql
工作,你应该能够让其余的工作,但是配置和连接的细微差别很棘手:
freetds.conf:
[MYSERVERNAME]
host = MYSERVERNAME.host.com
port = 1433
tds version = 7.2
odbc.ini:
[MYSERVERNAME]
Driver = FreeTDS
Server = MYSERVERNAME.host.com
Port = 1433
TDS_Version = 7.2
odbcinst.ini:
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
在Python中:
connection = pyodbc.connect(r'DRIVER={FreeTDS};SERVER=MYSERVERNAME.host.com;PORT=1433;DATABASE=Database name;UID=Database Username;PWD=DatabasePasswd;TDS_Version=7.2')
TDS 8.0 版不存在。 7.2 是 FreeTDS 0.91 中支持的最高版本。混淆解释见这里:http://www.freetds.org/userguide/choosingtdsprotocol.htm
如果仍有问题,请尝试使用 tsql
和 isql
分别测试连接堆栈的 FreeTDS 和 unixODBC 层。祝你好运!
好吧,我们解决了这个问题——在这个页面和其他页面上的很多人的帮助下
正如(最终)怀疑的那样,它是连接中的 pyodbc link。我正在使用 pyodbc v3.0.10,通过从 Anaconda 包存储库下载。解决方案是 v.3.0.9。一旦我卸载了 v3.0.10,从 pypi 存储库下载了 v3.0.9,然后构建并安装了我自己的 conda 包……它成功了。
我采取的步骤如下(注意这些是特定于 anaconda 环境的):
conda uninstall pyodbc
conda skeleton pypi pyodbc --version 3.0.9
conda build pyodbc
conda install pyodbc=3.0.9 --use-local
一旦我回到我的 Jupyter notebook 和 运行 上面的相同代码,它就建立了良好的连接。
我不知道 v.3.0.10 有什么问题,或者只是 anaconda.org 在其存储库中的文件有问题。我也在 pyodbc github 页面上发布了一些内容,但它看起来并不那么活跃。
总之,谢谢大家的帮助。我希望这可以节省一些时间。
只需卸载 pyodbc 并重新安装它就解决了我的问题。