Dart postgres包执行select语句抛出PostgreSQLSeverity.error 42601异常
Dart postgres包模糊匹配查询异常解决方案
异常根本原因
SQL语法本身不支持IN子句和LIKE模糊匹配直接组合使用,IN仅支持精确匹配固定值列表,和你的模糊查询需求逻辑不兼容。
可直接落地的实现方案
方案1:使用ANY关键字适配数组参数(推荐)
PostgreSQL原生支持LIKE ANY语法匹配数组内的所有模糊规则,Dart postgres包可直接传递列表作为数组参数,代码最简洁:
// 入参contacts为已添加%前缀的号码列表,示例:['%13800138000', '%13900139000'] Future<List<Map<String, dynamic>>> getMatchingContacts(List<String> contacts) async { final queryResult = await connection.query( "SELECT * FROM 你的表名 WHERE 电话号码列名 LIKE ANY(@contactList)", substitutionValues: { "contactList": contacts, }, ); return queryResult.toList(); }
方案2:动态拼接OR条件(兼容低版本PostgreSQL)
如果你的PostgreSQL版本不支持ANY语法,可以动态生成多个LIKE条件用OR拼接,全程参数化避免SQL注入:
Future<List<Map<String, dynamic>>> getMatchingContacts(List<String> contacts) async { // 生成对应数量的占位条件 final likeConditions = List.generate(contacts.length, (index) => "电话号码列名 LIKE @p$index").join(" OR "); final sql = "SELECT * FROM 你的表名 WHERE $likeConditions"; // 生成参数映射 final params = Map.fromIterables( List.generate(contacts.length, (index) => "p$index"), contacts, ); final queryResult = await connection.query(sql, substitutionValues: params); return queryResult.toList(); }
注意事项
- 所有参数必须通过
substitutionValues绑定,禁止直接拼接字符串到SQL语句中,避免SQL注入风险 - 如果你需要前后都模糊匹配,给号码的首尾都添加
%前缀和后缀即可 - Dart postgres包会自动将Dart列表转换为PostgreSQL数组类型,无需手动处理格式转换
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

