Flutter中使用mysql1包执行MySQL select查询无效
问题排查与解决方案
1. 确认数据库连接目标(移动端场景必看)
如果在手机模拟器/真机上运行Flutter,localhost指向的是设备本身,而非运行MySQL的电脑:
- Android模拟器:将
_host改为10.0.2.2 - iOS模拟器:可直接用
localhost或127.0.0.1 - 真机:使用电脑的局域网IP地址(比如
192.168.1.100)
同时确保MySQL允许远程连接: - 修改MySQL配置文件的
bind-address为0.0.0.0 - 执行授权命令:
GRANT ALL ON mydb.* TO 'root'@'%' IDENTIFIED BY 'mypassword';,再运行FLUSH PRIVILEGES;
2. 重构异步代码,避免await与then混用
原代码混合使用await和then易导致逻辑混乱,重构后更清晰:
String questionText = ""; var db = MySql(); void getData(String questionID) async { final conn = await db.getConnection(); try { // 插入时指定字段名,避免表结构变动引发错误 await conn.query( "INSERT INTO questions (col1, col2, col3, col4, col5, col6, col7) VALUES (?, ?, ?, ?, ?, ?, ?)", ['a', 'a', 'a', 'a', 'a', 'a', '2'] ); final results = await conn.query("SELECT * FROM questions"); print(results); if (results.isNotEmpty) { // 注意:循环会覆盖questionText,最终仅保留最后一行的第一个字段 setState(() { questionText = results.last[0]; }); } else { print("no data"); setState(() { questionText = "no data"; }); } } catch (e) { print("数据库操作异常: $e"); } finally { // 关闭连接,避免资源泄漏 await conn.close(); } }
3. 显式开启自动提交事务
在连接配置中设置autoCommit,确保插入操作立即生效:
class MySql { static String _host = "localhost", _user = "root", _password = "mypassword", _db = "mydb"; static int _port = 3306; MySql(); Future<MySqlConnection> getConnection() async { var settings = ConnectionSettings( host: _host, port: _port, user: _user, password: _password, db: _db, autoCommit: true, // 显式开启自动提交 ); return await MySqlConnection.connect(settings); } }
4. 验证数据是否实际存入数据库
用MySQL客户端(如MySQL Workbench)连接目标数据库,执行SELECT * FROM questions:
- 若没有数据,说明插入操作实际失败,需检查表结构与插入字段是否匹配,或通过错误捕获查看具体异常
- 若有数据但Flutter查询不到,回到第一步确认连接的数据库是否正确
内容的提问来源于stack exchange,提问作者macDeltaTee
相关产品推荐
相关产品推荐

