CentOS环境下可通过tsql连接Azure SQL,为何pymssql无法连接?
解决pymssql连接Azure SQL Server失败的问题
既然你用T-SQL能正常连接,说明服务器本身、网络通路和账号权限都没问题,问题大概率出在pymssql的连接配置细节上。我给你梳理几个常见的排查方向和解决办法:
1. 强制开启加密(Azure SQL的硬性要求)
Azure SQL Server默认要求所有连接必须加密,而旧版本的pymssql可能没有默认开启这个选项。你需要在连接时明确指定加密参数:
import pymssql try: conn = pymssql.connect( server="your-server-name.database.windows.net", port=1433, # Azure SQL默认端口,必须指定 user="your-sql-username@your-server-name", # 注意格式:用户名@服务器名 password="your-password", database="your-database-name", encrypt="yes" # 关键参数,必须开启 ) print("连接成功!") conn.close() except Exception as e: print(f"连接失败:{str(e)}")
2. 检查用户名格式是否正确
Azure SQL的SQL Server身份验证账号,登录名必须是username@servername的格式(servername是你Azure上的服务器前缀,比如myserver对应myserver.database.windows.net)。如果只写用户名,pymssql会无法正确识别身份。
3. 升级pymssql到最新版本
旧版本的pymssql对Azure SQL的加密协议支持可能不完善,建议升级到最新稳定版:
pip install --upgrade pymssql
4. 如果是Azure AD身份验证,换用pyodbc
pymssql对Azure AD身份验证的支持有限,如果你用的是Azure AD账号(比如AAD用户、服务主体),建议改用pyodbc,它对Azure SQL的兼容性更好。示例代码:
import pyodbc conn_str = ( "DRIVER={ODBC Driver 17 for SQL Server};" "SERVER=your-server-name.database.windows.net;" "DATABASE=your-database-name;" "UID=your-aad-username@your-domain.com;" "PWD=your-aad-password;" "Encrypt=yes;" "TrustServerCertificate=no;" "Connection Timeout=30;" ) try: conn = pyodbc.connect(conn_str) print("连接成功!") conn.close() except Exception as e: print(f"连接失败:{str(e)}")
5. 排查网络细节(概率较低,但可以确认)
虽然T-SQL能连接,但如果pymssql运行的环境有特殊网络配置(比如代理、防火墙规则),可以检查:
- 出站端口1433是否开放
- 是否需要设置代理参数(pymssql支持通过
proxy_host和proxy_port指定代理)
如果以上步骤都试过还是报错,可以把完整的异常信息贴出来,我再帮你进一步分析。
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

