Flutter中使用sqljocky5连接MySQL数据库时抛出异常求助
先把你的代码整理成规范格式:
void getInfo () async { var pool = new ConnectionPool( host: 'localhost', port: 3305, user: 'root', password: 'mysql', db: 'smartlender', max :5 ); print('test'); var results = await pool.query('SELECT employee.firstName FROM smartlender.employee;'); // 异常抛出位置 results.forEach((row){ names.add(row[0].toString()); }); }
结合你的描述(已确认连接正常、SQL语句无误),我给你几个针对性的排查和解决方向:
检查平台兼容性(最常见的坑):
sqljocky5依赖Dart的dart:io库,只能在**Flutter Desktop(Windows/macOS/Linux)**或者纯Dart后端项目中使用。如果你是在iOS/Android移动端运行Flutter,直接用sqljocky5连接MySQL是行不通的——移动端应用不允许直接访问外部数据库,必须通过后端API接口中转数据。如果是移动端场景,建议你搭建一个简单的后端服务(比如用Dart的Aqueduct、Node.js等),然后Flutter通过HTTP请求和后端交互。修正主机地址(针对模拟器/远程连接场景):
如果你是在Android模拟器或iOS模拟器中运行代码,localhost指向的是模拟器本身,而不是你的电脑。这时候需要把host改成:- Android模拟器:用
10.0.2.2(这是Android模拟器内置的指向宿主电脑的IP) - iOS模拟器:可以直接用你的电脑局域网IP(比如
192.168.1.100),或者localhost有时候也能生效(iOS模拟器和宿主共享网络栈)
如果是真实设备,必须用电脑的局域网IP或者公网IP(如果数据库在公网)。
- Android模拟器:用
确认MySQL用户权限:
MySQL默认的root用户只允许从localhost访问,如果你是从模拟器、真实设备或者其他远程IP连接,需要给root用户授权远程访问权限:GRANT ALL PRIVILEGES ON smartlender.* TO 'root'@'%' IDENTIFIED BY 'mysql'; FLUSH PRIVILEGES;注意:
%表示允许从任何IP访问,生产环境建议限制具体IP,避免安全风险。验证端口配置:
你指定的端口是3305,请确认你的MySQL服务确实监听这个端口:- Windows:查看
my.ini文件中的port配置 - macOS/Linux:查看
my.cnf文件中的port配置
可以用telnet 你的IP 3305或者nc -zv 你的IP 3305测试端口是否能连通。
- Windows:查看
简化SQL查询语句:
因为你已经在ConnectionPool中指定了db: 'smartlender',查询的时候不需要再写库名前缀,简化后的SQL更清晰,也避免潜在的解析问题:var results = await pool.query('SELECT firstName FROM employee;');
最后,建议你在代码中添加异常捕获,这样能看到更详细的错误信息,方便排查:
void getInfo () async { try { var pool = new ConnectionPool( host: 'localhost', port: 3305, user: 'root', password: 'mysql', db: 'smartlender', max :5 ); print('test'); var results = await pool.query('SELECT firstName FROM employee;'); results.forEach((row){ names.add(row[0].toString()); }); } catch (e, stackTrace) { print('异常信息:$e'); print('堆栈跟踪:$stackTrace'); } }
内容的提问来源于stack exchange,提问作者dinith jayabodhi

