使用pymysql通过sshtunnel连接MySQL报WinError 10053错误求助
核心错误原因
你当前的代码存在缩进逻辑错误:SSHTunnelForwarder使用with上下文管理器管理生命周期,with块执行结束后会自动关闭SSH隧道,你把数据库连接后的cursor创建、SQL查询等逻辑全部写到了with块外部,此时SSH隧道已经被销毁,依赖隧道建立的MySQL连接自然会因为底层链路断开抛出连接终止错误。
修复方案
调整代码缩进,将所有数据库操作逻辑都放在with块内部,参考修正后的代码:
import pymysql from sshtunnel import SSHTunnelForwarder with SSHTunnelForwarder(('192.168.0.x', 22), ssh_username='pi', ssh_password='*********', remote_bind_address=('localhost', 3306)) as tunnel: # 隧道启动后所有数据库操作都要在这个缩进层级内完成 tunnel.start() mydb = pymysql.connect( host="localhost", user='Mashu', passwd='******', port=tunnel.local_bind_port, db='Special_Channels', connect_timeout=10 # 可选,增加连接超时配置避免偶发超时 ) print(mydb) # 连接存活时执行查询 query = "SELECT * FROM Daily" cur = mydb.cursor() data = cur.execute(query) # 注意execute返回的是影响行数,要拿数据需要调用cur.fetchall()/fetchone() result = cur.fetchall() print(f"影响行数:{data},查询结果:{result}") # 用完主动关闭连接 cur.close() mydb.close()
其他可选排查方向
如果调整缩进后仍有报错,可以排查以下点:
- 检查本地防火墙、安全软件是否拦截了SSH隧道绑定的本地端口通信,WinError 10053通常伴随本地程序主动断连的场景
- 可以在建立MySQL连接后先调用
mydb.ping(reconnect=True)主动校验连接存活状态 - 确认MySQL服务端的
wait_timeout参数没有配置过短,导致连接空闲后被服务端主动回收
内容的提问来源于stack exchange,提问作者Moder New
相关产品推荐
相关产品推荐

