无法通过pymssql连接到SQL Server

14 投票
3 回答
37022 浏览
提问于 2025-04-16 06:52

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

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中查看哪些日志吗?

3 个回答

0

你是在用Windows电脑吗?记得指定端口号1433。看起来这是mssql客户端接口的一个问题,它试图使用命名管道而不是TCP/IP。

2

看起来你已经解决了这个问题,不过对于其他从谷歌过来的人来说:要确保你的MS SQL Server上开启了混合模式授权。默认情况下,它只允许Windows授权,这样会导致在pymssql中出现这个错误。

15

明白了!我觉得问题的根源在于没有好好关注 Free TDS。Free TDS 显然是 pymssql 背后的驱动程序,它可以让我们连接到其他数据库,其中 SQL Server 就是一个。

我的系统(Mac Book Pro)上,freetds.conf 文件位于 /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 代码测试了一个简单的查询,以确保我能从数据库中读取数据。

希望这能在将来帮助到其他人。

撰写回答