使用Snowflake Python Connector拉取数据时遇SSLError问题求助
Snowflake Python Connector 无LIMIT时触发SSLError的解决方案
问题场景
- 已通过Snowflake Python Connector成功连接数据库并执行查询
- 未限制结果行数时,调用
cursor.fetch()触发以下SSLError:
SSLError: HTTPSConnectionPool(host='XXXXXXXXXXXXXX.blob.core.windows.net', port=443): Max retries exceeded with url: /results/XXX..XXX=https&se=2022-1012...&sr=b&sp=r&sig=X...X%2XX.XX=gzip (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines','tls_process_server_certificate', 'certificate verify failed')])")))
- 添加
LIMIT 300等限制条件后,fetchall()可正常获取数据
解决方案
1. 指定SSL根证书路径
大结果集时Snowflake会将数据存到Azure Blob Storage,若本地根证书库不包含Blob存储的证书,就会触发验证失败。手动指定证书路径:
import snowflake.connector conn = snowflake.connector.connect( user='你的用户名', password='你的密码', account='你的账号', warehouse='你的仓库', database='你的数据库', schema='你的schema', ssl_ca='/path/to/root_cert.pem' # 替换为本地根证书文件路径 )
- 可使用系统默认根证书:Linux下一般是
/etc/ssl/certs/ca-certificates.crt,Windows可从证书管理器导出根证书
2. 临时禁用SSL验证(仅测试环境)
测试环境下可临时关闭验证排查问题,生产环境绝对禁止使用:
conn = snowflake.connector.connect( # 保留其他连接参数 insecure_mode=True )
3. 分批获取结果集
不用LIMIT,改用分批拉取数据,避免一次性请求大结果:
cursor = conn.cursor() cursor.execute("SELECT * FROM 你的表") batch_size = 1000 # 可根据实际调整批次大小 while True: batch_data = cursor.fetchmany(batch_size) if not batch_data: break # 处理每一批数据 for row in batch_data: # 你的业务逻辑 print(row)
4. 检查本地SSL与代理配置
- 若使用代理,确认代理未拦截SSL证书,代理配置正确
- 更新本地OpenSSL版本,旧版本可能存在证书验证兼容性问题
- 更新系统根证书库:Linux执行
update-ca-certificates,Windows通过系统更新或手动导入根证书
内容的提问来源于stack exchange,提问作者Wren
相关产品推荐
相关产品推荐

