使用pymssql连接SQL Server实例

11 投票
3 回答
16123 浏览
提问于 2025-04-17 12:27

我正在尝试通过 pymssql 从 Windows 电脑连接到 SQL Server(使用的是版本 2.0.0b1-dev-20111019 和 Python 2.7.1)。我在控制台上尝试了最基本的方法:

import pymssql
c = pymssql.connect(host = r'servername\instance',
                    user = 'username',
                    password = 'userpassword')

结果我收到了一个非常有帮助的错误信息:InterfaceError: 连接数据库失败,原因不明。

我对连接信息的正确性还是有信心的,因为我用 adodbapi 时可以正常连接,使用的命令如下:

import adodbapi
c = adodbapi.connect(r'Provider=sqloledb;Data Source=servername\instance;User ID=username;password=userpassword;'
c.close

我尝试在主机参数中添加端口号,但结果还是一样。有没有人能给我一些建议,帮我解决这个问题呢?


顺便说一下,我看过这个链接的回复:"无法通过 pymssql 连接到 SQL Server"。原发帖者最终通过正确配置 FreeTDS 解决了问题,但根据我的了解,pymssql 在 Windows 上并不使用 FreeTDS。


根据 @cha0site 的建议,我尝试只使用主机名,而不是主机名和实例名。结果还是同样的错误,不过生成错误的时间似乎更长了(尽管错误追踪仍然指向同一行)。我之所以指定实例名,是因为在使用 SSMS 连接时,必须指定实例名,所以我以为其他连接也需要这样。


我现在也尝试了 pymssql.connect(host='servername', user='username', password='userpassword', database='instance'),结果还是一样(根据 @Sid 的评论)。根据 pymssql 文档,我认为 database 参数是用来指定用户要连接的初始数据库,而不是实例。

为了澄清一下,“实例”是安装 SQL Server 时提供的名称,而不是该安装中的数据库。我想到 pymssql 可能不支持这种表示法,所以我会考虑重新配置 SQL Server 实例,以便不需要指定它。


我现在已经重新安装了 SQL Server,作为默认实例,而不是命名实例,这样我就可以在不指定实例名的情况下连接。adodbapi 仍然可以正常工作(不需要 /instance),但 pymssql 仍然返回相同的错误。我还从新下载的压缩包中删除并重新安装了 pymssql(版本还是一样)。

3 个回答

0

在我的工作环境中可以使用以下信息:

pymssql 版本:2.2.8

Python 版本:3.11

conn = pymssql.connect(host=r'10.0.1.29:60001\sql2019', user='sa', password='sa', charset='UTF-8', atabase=r'database1', tds_version=r'7.0')

如果你使用的是 pymssql 2.2.8,tds_version 应该设置为 7.0。如果你还是遇到问题,可以尝试其他的 tds_version(比如 7.4、7.3、7.2、7.1、7.0 等等)。

你可以添加额外的版本信息和调试代码。

print('pymssql version: ', pymssql.__version__)
print('get_dbversion: ', pymssql.get_dbversion())
print('version_info: ', pymssql.version_info())
os.environ['TDSDUMP'] = 'stdout'
0

要指定 host=servername\instanceserver=servername\instance,SQL Server 机器上必须开启 SQL Server Browser 服务。

0

检查一下你的freetds.conf文件,看看你是否设置了端口1219。然后再检查一下连接情况:

DB = pymssql.connect(host='DB',user='youruser',password='yourpwd',database='yourDBname')

补充:这是我freetds.conf文件在Python中的一个例子:

host = 'IP'
port = 1219

撰写回答