Kivy应用连接MySQL服务器时崩溃,PC运行正常安卓端报错如何解决
问题根源
你代码里写的数据库连接host是localhost,电脑上运行时MySQL服务跑在本地电脑上,自然能正常连接。打包到安卓设备运行后,localhost指向的是安卓设备本身,安卓设备上没有部署MySQL服务,所以触发2003连接拒绝报错。连接失败后create_db_connection函数返回None,后续代码操作None对象调用cursor就触发了第二个属性错误。
解决方案
1. 修改数据库连接配置
把连接host从localhost替换为MySQL服务实际部署设备的IP地址:
- 局域网测试场景:安卓设备和运行MySQL的电脑连同一个WiFi,填电脑的局域网IP(Windows可在cmd执行
ipconfig查看,Linux/macOS执行ifconfig查看) - 公网使用场景:将MySQL部署到云服务器,填云服务器的公网IP
- 额外配置:开放MySQL所在设备的3306端口防火墙规则,同时配置MySQL允许非本地IP访问,对应数据库账号的host权限要设置为
%或者安卓设备的IP,不能仅允许localhost访问。
2. 新增连接失败拦截逻辑
你当前的代码没有判断连接状态就直接执行查询,极容易触发崩溃,需要增加非空判断:
connection = create_db_connection("MySQL服务实际IP", "yourusername", "yourpassword", "yourdbname") # 新增连接失败判断 if not connection: # 弹出连接失败的用户提示,终止后续逻辑 showConnectionErr() return results = read_query(connection, q1)
3. 优化登录验证逻辑(强烈建议)
你当前的逻辑是查询全表所有用户再匹配账号密码,不仅运行效率极低,还存在严重的SQL注入风险,建议改成参数化条件查询:
# 参数化查询避免SQL注入,同时只查询匹配的用户数据 q1 = """ SELECT 1 FROM tablename WHERE firstcolumn = %s AND secondcolumn = %s """ params = (self.first_namee.text, self.password.text) # 执行查询后仅判断是否有返回结果即可完成校验,无需拉取全表数据
4. 修正buildozer依赖配置
你当前的依赖里重复写了mysql.connector和mysql.connector.python,保留一个mysql-connector-python即可,避免打包时出现依赖冲突。
内容的提问来源于stack exchange,提问作者Ded Meme
相关产品推荐
相关产品推荐

