使用pymssql连接SQL Server实例
我正在尝试通过 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 个回答
在我的工作环境中可以使用以下信息:
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'
要指定 host=servername\instance 或 server=servername\instance,SQL Server 机器上必须开启 SQL Server Browser 服务。
检查一下你的freetds.conf文件,看看你是否设置了端口1219。然后再检查一下连接情况:
DB = pymssql.connect(host='DB',user='youruser',password='yourpwd',database='yourDBname')
补充:这是我freetds.conf文件在Python中的一个例子:
host = 'IP'
port = 1219