使用Polars和connectorx连接SSMS与Python时遇超时错误求助
排查ConnectorX连接SQL Server超时问题
问题背景
尝试通过ConnectorX连接SQL Server(对应SSMS管理的数据库),已使用urllib.parse.quote_plus处理含特殊字符的密码和服务器名,但执行查询30秒后触发超时错误。
用户代码
import connectorx as cx import urllib.parse conn = 'mssql://sa:{}@{}:5432/Planning_insight?encrypt=true&trusted_connection=true'.format( urllib.parse.quote_plus('MYPASSWORD'), urllib.parse.quote_plus('MYSERVER\SQLEXPRESS') ) str_query = f"SELECT * FROM raw.calendar" cx.read_sql(conn,str_query)
错误信息
RuntimeError Traceback (most recent call last) Cell In[1], line 10 4 conn = 'mssql://sa:{}@{}:5432/Planning_insight?encrypt=true&trusted_connection=true'.format( 5 urllib.parse.quote_plus('MYPASSWORD'), 6 urllib.parse.quote_plus('MYSERVER\SQLEXPRESS') 7 ) 8 str_query = f"SELECT * FROM raw.calendar" ---> 10 cx.read_sql(conn,str_query) File c:\Users\lorenzsc\AppData\Local\miniconda3\envs\padp2\lib\site-packages\connectorx\__init__.py:224, in read_sql(conn, query, return_type, protocol, partition_on, partition_range, partition_num, index_col) 221 except ModuleNotFoundError: 222 raise ValueError("You need to install pandas first") ---> 224 result = _read_sql( 225 conn, 226 "pandas", 227 queries=queries, 228 protocol=protocol, 229 partition_query=partition_query, 230 ) 231 df = reconstruct_pandas(result) 233 if index_col is not None: RuntimeError: Timed out in bb8
排查与解决方案
1. 修正数据库端口(最可能的根因)
SQL Server默认端口是1433,当前使用的5432是PostgreSQL的默认端口,这会导致无法连接到SQL Server实例。修改连接字符串中的端口:
conn = 'mssql://sa:{}@{}:1433/Planning_insight?encrypt=true&trusted_connection=true'.format( urllib.parse.quote_plus('MYPASSWORD'), urllib.parse.quote_plus(r'MYSERVER\SQLEXPRESS') # 用原始字符串避免转义问题 )
2. 修复服务器名的转义问题
Python字符串中的\是转义字符,直接写MYSERVER\SQLEXPRESS可能导致解析异常,改用原始字符串(前缀r)或者将\改为\\:
# 方式1:原始字符串 urllib.parse.quote_plus(r'MYSERVER\SQLEXPRESS') # 方式2:转义反斜杠 urllib.parse.quote_plus('MYSERVER\\SQLEXPRESS')
3. 调整加密与信任连接参数
同时设置encrypt=true和trusted_connection=true可能引发证书验证超时,针对SQL Server Express的自签名证书,可添加trust_server_certificate=true参数,或关闭加密(仅本地测试时建议):
# 带证书信任的连接字符串 conn = 'mssql://sa:{}@{}:1433/Planning_insight?encrypt=true&trusted_connection=true&trust_server_certificate=true'.format( urllib.parse.quote_plus('MYPASSWORD'), urllib.parse.quote_plus(r'MYSERVER\SQLEXPRESS') )
4. 测试基础网络连通性
用PowerShell验证服务器端口是否可达:
Test-NetConnection MYSERVER -Port 1433
如果连接失败,需检查SQL Server的TCP/IP协议是否启用(在SQL Server Configuration Manager中配置),以及防火墙是否允许1433端口通信。
5. 增加超时时间
在连接字符串中添加timeout参数延长超时时间(单位:秒):
conn = 'mssql://sa:{}@{}:1433/Planning_insight?encrypt=true&trusted_connection=true&trust_server_certificate=true&timeout=60'.format( urllib.parse.quote_plus('MYPASSWORD'), urllib.parse.quote_plus(r'MYSERVER\SQLEXPRESS') )
6. 验证SQL Server配置
- 确保SQL Server启用混合认证模式(Windows+SQL Server认证),且
sa账户已启用、密码正确。 - 在SQL Server Configuration Manager中,确认
SQL Server Network Configuration下的TCP/IP协议已启用。
内容的提问来源于stack exchange,提问作者Lorenzo Scandolara
相关产品推荐
相关产品推荐

