PythonAnywhere无Flask/Django时Python连接MySQL无响应问题求解
问题根因
PythonAnywhere的MySQL服务有平台专属访问规则,加上MySQLdb默认无超时配置,配置不符合规则时不会主动抛错,会直接挂起无响应,该场景完全不需要依赖Flask、Django等Web框架,直接运行普通Python脚本即可连接。
分步解决方法
- 确认脚本运行环境:必须在PythonAnywhere平台内置的Bash/Python控制台、平台托管的定时任务/常驻进程中运行脚本。PythonAnywhere的MySQL实例不对外开放公网访问,从你本地电脑直接运行脚本连接会一直卡住无响应,不会返回明确错误,这是最高发的触发原因。
- 核对连接参数准确性:
- 主机地址从PythonAnywhere后台「Databases」页面直接复制,格式为
你的用户名.mysql.pythonanywhere-services.com,不要手动拼写避免字符错漏 - 数据库名必须携带
用户名$前缀,例如用户名为myuser、库名为mydb时,完整库名是myuser$mydb,$符号不可省略 - 连接密码是你在Databases页面单独设置的MySQL专用密码,和PythonAnywhere账号的登录密码互相独立,遗忘可直接在页面重置
- 传入的密码参数是字符串类型,需要用引号包裹,原有代码里
passwd = XXX如果没加引号会直接触发变量未定义错误
- 主机地址从PythonAnywhere后台「Databases」页面直接复制,格式为
- 增加连接超时配置:MySQLdb默认不设置连接超时,网络不通时会无限等待,在
connect()方法中添加connect_timeout=10参数,连接失败时10秒就会抛出明确错误,不会一直无响应。 - 验证表和数据存在:如果查询的表不存在、或者表内无数据,遍历游标的循环不会输出任何内容,会被误认为无响应。可以先执行
SHOW TABLES语句确认目标表存在,再执行业务查询。
修正后可直接运行的参考代码
import MySQLdb # 替换所有占位参数为你的真实配置 db = MySQLdb.connect( host = "myuser.mysql.pythonanywhere-services.com", user = "myuser", passwd = "你的MySQL专用密码", db = "myuser$db_name", connect_timeout=10 ) cursor = db.cursor() # 校验库内表列表 cursor.execute("SHOW TABLES") print("当前数据库下的表:", [table[0] for table in cursor.fetchall()]) # 执行业务查询 cursor.execute("SELECT * FROM table_name") print("查询结果:") for row in cursor.fetchall(): print(row) cursor.close() db.close()
补充:免费版PythonAnywhere账号需要先进入Databases页面点击初始化MySQL按钮,设置完密码后数据库实例才会启动,未初始化时连接也会挂起无响应。
内容的提问来源于stack exchange,提问作者Eddyhut
相关产品推荐
相关产品推荐

