Python 使用pyODBC、unixODBC和FreeTDS(在Mac上)连接MS SQL Server时出错
尝试使用pyODBC-->unixODBC-->FreeTDS-->MS SQL堆栈连接到python中的MS SQL server时出错。我在这方面花了很多时间,如果你已经解决了与工作和生活联系的更基本的问题,那么这里有一些很好的资源 然而,我的问题是关于一个(我认为)非常接近这一令人沮丧经历的终点线的错误。具体而言,jupyter笔记本中的以下代码:Python 使用pyODBC、unixODBC和FreeTDS(在Mac上)连接MS SQL Server时出错,python,sql-server,pyodbc,freetds,unixodbc,Python,Sql Server,Pyodbc,Freetds,Unixodbc,尝试使用pyODBC-->unixODBC-->FreeTDS-->MS SQL堆栈连接到python中的MS SQL server时出错。我在这方面花了很多时间,如果你已经解决了与工作和生活联系的更基本的问题,那么这里有一些很好的资源 然而,我的问题是关于一个(我认为)非常接近这一令人沮丧经历的终点线的错误。具体而言,jupyter笔记本中的以下代码: pyodbc.connect( 'DRIVER=/usr/local/lib/libtdsodbc.so;' 'SERVER=
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)’)
我的设置背景
我的连接是使用第一段中链接的两个资源建立的(并且重建和重建),我的完整设置如下所示:
[MYSERVERNAME]
host = MyServerIP
port = 1433
tds version = 7.3
client charset = UTF-8
[MYSERVERNAME]
Driver = FreeTDS
Server = MyServerIP
Port = 1433
环境
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—使用unixodbc`
pyODBC 3.0.10–使用conda安装安装
MS SQL–AWS EC2实例(云)
参考文件
我的freetds.conf文件如下所示:
[MYSERVERNAME]
host = MyServerIP
port = 1433
tds version = 7.3
client charset = UTF-8
[MYSERVERNAME]
Driver = FreeTDS
Server = MyServerIP
Port = 1433
我的odbcinst.ini文件如下所示:
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtdsodbc.so
FileUsage = 1
我的odbc.ini文件如下所示:
[MYSERVERNAME]
host = MyServerIP
port = 1433
tds version = 7.3
client charset = UTF-8
[MYSERVERNAME]
Driver = FreeTDS
Server = MyServerIP
Port = 1433
我完全不知所措,在这件事上花的时间远远超过了我应该花的时间。如果有人有任何建议,我将永远感激
谢谢。你的问题中有很多活动部件。不仅在ODBC上有Python笔记本,还有iODBC和OS X.Yikes 问题归结为:iODBC在哪里查找
odbc.ini
?我不知道有哪个ODBC函数可以报告这些信息
因为它非常复杂,我建议使用OSXdtruss(1)。将输出捕获到文件中,并使用grep for odbc.ini和/或open命令。一旦你知道它在哪里,你可以把你的文件放在那里,然后按照指示去做
osql脚本在OSX上不起作用的原因是从来没有人愿意让它起作用,也没有人在FreeTDS邮件列表中抱怨过它。第一条信息是一个傻瓜:
/usr/local/bin/osql:未找到第53行:ldd:命令
我和你一起解决这个问题
$ 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
[MYSERVERNAME]
Driver = FreeTDS
Server = MYSERVERNAME.host.com
Port = 1433
TDS_Version = 7.2
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
connection = pyodbc.connect(r'DRIVER={FreeTDS};SERVER=MYSERVERNAME.host.com;PORT=1433;DATABASE=Database name;UID=Database Username;PWD=DatabasePasswd;TDS_Version=7.2')
odbc.ini:
[MYSERVERNAME]
host = MYSERVERNAME.host.com
port = 1433
tds version = 7.2
[MYSERVERNAME]
Driver = FreeTDS
Server = MYSERVERNAME.host.com
Port = 1433
TDS_Version = 7.2
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
connection = pyodbc.connect(r'DRIVER={FreeTDS};SERVER=MYSERVERNAME.host.com;PORT=1433;DATABASE=Database name;UID=Database Username;PWD=DatabasePasswd;TDS_Version=7.2')
odbcinst.ini:
[MYSERVERNAME]
host = MYSERVERNAME.host.com
port = 1433
tds version = 7.2
[MYSERVERNAME]
Driver = FreeTDS
Server = MYSERVERNAME.host.com
Port = 1433
TDS_Version = 7.2
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
connection = pyodbc.connect(r'DRIVER={FreeTDS};SERVER=MYSERVERNAME.host.com;PORT=1433;DATABASE=Database name;UID=Database Username;PWD=DatabasePasswd;TDS_Version=7.2')
Python中的:
[MYSERVERNAME]
host = MYSERVERNAME.host.com
port = 1433
tds version = 7.2
[MYSERVERNAME]
Driver = FreeTDS
Server = MYSERVERNAME.host.com
Port = 1433
TDS_Version = 7.2
[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
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中支持的最高版本。请参见此处以解释混淆:
如果仍然存在问题,请尝试使用tsql
和isql
分别测试连接堆栈的FreeTDS和unixODBC层。祝你好运 好吧,我们解决了这个问题——在这一页和其他页面上的很多人的帮助下,我们找到了很多死路
正如(最终)所怀疑的,这是连接中的pyodbc链接。我使用的是pyodbc v3.0.10,从Anaconda软件包存储库下载。溶液为v.3.0.9。一旦我卸载了v3.0.10,从pypi存储库下载了v3.0.9,然后构建并安装了我自己的conda软件包。。。成功了
我采取的步骤如下(注意,这些步骤是针对蟒蛇环境的):
当我回到我的Jupyter笔记本并运行上面相同的代码时,它创建了一个良好的连接
我不知道v.3.0.10有什么问题,或者只是anaconda.org存储库中的文件有什么问题。我也在pyodbc github页面上发布了一些东西,但它看起来没有那么活跃
无论如何,谢谢大家的帮助。我希望这能节省一些时间 卸载pyodbc并重新安装就解决了我的问题。看看另一个问题是否有帮助-试试TDS version=8.0…谢谢@BennyHill,严格遵守链接中的说明导致我无法通过isql命令建立连接。如上所述,我的tsql和isql测试都创建连接。我越来越确信这与pyODBC-->unixODBC连接中的故障有关。有两件事,(1)请在pyodbc.connect()中使用
DRIVER={FreeTDS}
,以及(2)不要使用TDS版本8.0,它不是真正的TDS版本。看:做了你建议的改变,但没有乐趣。正如我在下面的评论中所说,但也在FreeTDS周围添加了大括号。相同错误:错误:('00000','[00000][iODBC][Driver Manager]dlopen({FreeTDS},6):找不到图像(0)(SQLDriverConnect)
谢谢James,非常有帮助,我将按照您的指导进行操作。一个警告:我不想使用iODBC。我尝试使用unixODBC,因为正如您所指出的,它似乎更受欢迎/更受支持。然而,根据我上面提到的第二个错误,pyODBC(v3.0.10)似乎正在使用iODBC。我不知道为什么。这让我很难过。是的,很多活动的部分。但我不认为我的设置有那么奇怪,是吗?我只是一个有mac电脑的家伙,试图用jupyter笔记本将sql表读入pandas数据框。如果有更简单的方法,请,请,请告诉我。我已经把我的问题缩小到我认为是问题的范围,这里:谢谢FlipperPA,但没有快乐。我已经尝试了所有的方法,包括各种FreeTDS版本(7.0,