13

我正在尝试通过 pymssql 从本地服务器上的 *nix 系统连接到在 Windows XP 系统上运行的 SQL Server。但是,连接失败,如下所示

db = pymssql.connect(host='192.168.1.102',user='www',password='test',database='TestDB')
Traceback (most recent call last):

File "<stdin>", line 1, in <module>
File "pymssql.pyx", line 457, in pymssql.connect (pymssql.c:6041)
raise InterfaceError(e[0])
pymssql.InterfaceError: Connection to the database failed for an unknown reason.

我尝试过的事情:

  1. 将 SQL Server 和浏览器设置为作为网络服务器运行。
  2. 设置用户“www”。我还在 SQL Studio 中本地测试了这个用户。
  3. 关闭 Windows 防火墙(当然是暂时的)。

我错过了一些东西 - 我只是不知道它是什么。我尝试了 Windows 上的所有无限菜单选项,但均无济于事。我注意到的一件事是,如果 Windows 防火墙已打开(我为 SQL Server 设置了一个例外),python 会暂停很长时间,然后给出错误。如果防火墙关闭,错误是即时的。

我可以在 SQL Server 中查看任何日志吗?

4

3 回答 3

14

知道了!我认为问题的根源在于没有给予 Free TDS 所需的关注。Free TDS 显然是 pymssql 背后的驱动程序,并提供与其他数据库的连接 - SQL Server 就是其中之一。

freetds.conf 文件位于我的系统(Mac Book Pro)上的 /usr/local/etc 中。

此文件包含安装的默认值。但是,我之前添加了一个定义,以便我可以连接但忘记了它,不幸的是没有记下它。

无论如何,这是我附加到 freetds.conf 的示例:

[SomeDB]
    host = 192.168.1.102
    port = 1219
    tds version = 7.0

然而,令人费解的是,我将端口设置为 1219。我在 SQL Studio 中将其手动设置为 1433。另外,我使用的是 TDS 0.82 版,所以我不知道 7.0 是如何适应的。

接下来,我使用 'tsql' 测试连接性,如下所示:

tsql -S SomeDB -U www

我输入密码并获得一个允许 SQL 查询的命令行。

接下来,我测试了使用 pymssql 的连接,如下所示:

db = pymssql.connect(host='SomeDB',user='www',password='cylon',database='TestDB')

如您所见,我需要使用 freetds.conf 文件中的主机名,而不是直接使用 IP。然后我用额外的 python 代码测试了一个简单的查询,以确保我可以从数据库中读取。

我希望这对将来的其他人有所帮助。

于 2010-11-11T22:10:52.253 回答
2

看起来你已经解决了这个问题,但是对于来自谷歌的其他任何人来说:检查以确保在你的 MS SQL Server 上打开了混合模式授权。它默认只允许 Windows 授权,这将导致pymssql.

于 2011-06-06T18:25:40.043 回答
0

它是你正在使用的 Windows 机器吗?指定端口 1433。这似乎是 mssql 客户端 api 中的一个错误,它试图使用 Namedpipes 而不是 TCP/IP。

于 2010-11-11T00:58:10.093 回答