Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyODBC、unixODBC和FreeTDS(在Mac上)连接MS SQL Server时出错_Python_Sql Server_Pyodbc_Freetds_Unixodbc - Fatal编程技术网

Python 使用pyODBC、unixODBC和FreeTDS(在Mac上)连接MS SQL Server时出错

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-->unixODBC-->FreeTDS-->MS SQL堆栈连接到python中的MS SQL server时出错。我在这方面花了很多时间,如果你已经解决了与工作和生活联系的更基本的问题,那么这里有一些很好的资源

然而,我的问题是关于一个(我认为)非常接近这一令人沮丧经历的终点线的错误。具体而言,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)’)
我的设置背景

我的连接是使用第一段中链接的两个资源建立的(并且重建和重建),我的完整设置如下所示:

[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,