树莓派Zero远程访问树莓派3B+上MySQL服务器报Cursor未连接错误
解决方案
1. 修正MySQL用户授权规则
你当前创建的用户仅允许从树莓派3B+本身的IP登录,需要调整为允许树莓派Zero的IP访问:
首先删除原有错误授权的用户:DROP USER '<remote user>'@'<rpi3 ip>';
重新创建授权(替换尖括号内容为你实际的配置值):
create user '<remote user>'@'<树莓派Zero的实际IP>' identified by '<password>'; grant all privileges on <db>.home to '<remote user>'@'<树莓派Zero的实际IP>'; FLUSH PRIVILEGES;
如果不需要限制访问来源,也可以将IP替换为'%'允许所有IP访问,仅建议局域网环境下使用。
2. 修正代码参数错误
你的main函数调用存在2处语法错误,是触发报错的核心原因之一:
- 字段名列表需要传入字符串,
[temperature]中的temperature是未定义变量,应该改为['temperature'] write方法的values参数要求传入可迭代的序列(列表/元组),单个数值20会触发参数匹配错误,需要改为[20]或者(20,)
3. 添加连接保活逻辑
MySQL会主动断开闲置的长连接,导致游标失效,需要在执行SQL前检查连接状态,断开自动重连,修正后的完整代码如下:
import mysql.connector class Writer: def __init__(self): self.host = '<rpi3 ip>' self.user = '<remote user>' self.password = '<password>' self.database = '<db>' self.con = None self.cur = None self._connect() def _connect(self): # 避免重复创建连接 if self.con and self.con.is_connected(): return self.con = mysql.connector.connect( host=self.host, user=self.user, password=self.password, database=self.database ) self.cur = self.con.cursor() # 构建SQL查询命令字符串 def __build_string(self,table,names): v = "" s = "" for i in names: v = v + i + "," s = s + "%s," v = v[:-1] s = s[:-1] return "INSERT INTO " + table + " (" + v + ") VALUES (" + s + ")" def write(self,table,names,values): # 执行前检查连接状态,断开自动重连 if not self.con or not self.con.is_connected(): self._connect() command_string = self.__build_string(table,names) self.cur.execute(command_string,tuple(values)) self.con.commit() return def terminate_connection(self): if self.cur: self.cur.close() if self.con and self.con.is_connected(): self.con.close() return def main(): sql = Writer() # 修正后的传参 sql.write('home',['temperature'],[20]) sql.terminate_connection() if __name__ == "__main__": main()
4. 确认MySQL配置生效
你之前添加的bind-address = 0.0.0.0是正确配置,不要改回127.0.0.1,修改配置后需要重启MySQL服务让配置生效:sudo systemctl restart mysql
内容的提问来源于stack exchange,提问作者JabbaThePadd
相关产品推荐
相关产品推荐

