树莓派连接PC端WAMP MySQL数据库时卡在connector.Connect的问题求助
解决树莓派连接PC端WAMP MySQL时卡在
connector.Connect的问题 这种卡在连接函数且完全不触发异常的情况,大概率是网络层面的阻塞或者MySQL服务的访问限制导致的——毕竟你的代码连print('1')都没执行,说明程序还在一直等待连接响应,根本没走到错误处理那一步。我帮你梳理几个最常见的原因和对应的解决办法:
1. MySQL服务只绑定了本地回环IP
默认情况下,MySQL可能只允许本地(127.0.0.1)访问,局域网内的树莓派根本连不上PC的MySQL服务。你需要修改WAMP的MySQL配置:
- 打开WAMP管理器,右键点击MySQL → 选择
my.ini打开配置文件 - 找到
bind-address这一行,把它改成bind-address = 0.0.0.0(允许所有IP访问)或者直接写你的PC局域网IP192.168.0.104 - 保存配置后,重启WAMP的MySQL服务(WAMP管理器里点击MySQL → 重启服务)
2. Windows防火墙拦截了3306端口
Windows默认防火墙会阻止外部设备访问本机的3306端口,树莓派的连接请求被防火墙挡在外面,程序就会一直等待超时(默认超时时间很长,所以看起来像是卡住了)。解决办法:
- 打开Windows Defender防火墙高级设置
- 新建一条入站规则:选择TCP协议,指定端口3306,允许来自局域网(比如
192.168.0.0/24网段)的连接 - 也可以先临时关闭防火墙测试,如果能正常连接了,就说明是防火墙的问题,再把规则配置好即可
3. MySQL用户的访问权限范围不对
你说已经给树莓派配置了用户权限,但很可能只给了localhost的访问权限,树莓派从局域网IP连接时会被拒绝(这种情况有时候不会立刻抛异常,而是导致连接超时)。你需要重新配置用户权限:
- 在PC上打开WAMP的MySQL控制台,登录root用户
- 执行以下SQL语句(替换成你的用户名和密码):
这里的GRANT ALL PRIVILEGES ON tempbase.* TO 'own_pi'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;%表示允许该用户从任何IP连接,如果你想更安全,可以把%换成树莓派的固定局域网IP
4. 树莓派端的网络连通性或驱动问题
先确认树莓派能正常访问PC:
- 在树莓派的终端执行
ping 192.168.0.104,看能不能收到回应,确保网络连通 - 用
telnet 192.168.0.104 3306测试端口,如果能连通会看到MySQL的欢迎信息,否则说明端口不通 - 另外,也可能是mysql-connector版本太老导致的兼容性问题,执行
pip install --upgrade mysql-connector-python更新驱动
优化代码辅助排查
你可以给连接函数加上超时参数,这样超过指定时间没连上就会抛出异常,不会一直卡住:
from mysql import connector print('0') try: # 添加10秒连接超时,避免无限等待 con = connector.Connect( user='own_pi', password='password', database='tempbase', host='192.168.0.104', port=3306, connection_timeout=10 ) except connector.Error as e: print("Error code:", e.errno) print("SQLSTATE value:", e.sqlstate) print("Error message:", e.msg) print("Error:", e) except Exception as e: # 捕获其他意外异常,比如超时 print("Unexpected error:", str(e)) print('1') # 先判断连接是否成功再执行后续操作 if 'con' in locals() and con.is_connected(): cur = con.cursor() print('2') cur.execute("INSERT INTO `sensor_readings` (`uid`, `local_id`, `type`, `date`, `reading`) VALUES ('7', '4', 'temperature', '2018-06-04', '24.4');") print('3') con.commit() print('4') con.close() print('5') else: print("Connection failed, skip database operations")
内容的提问来源于stack exchange,提问作者Георги Няголов
相关产品推荐
相关产品推荐

