如何在Vapor/Fluent中安全查询PostgreSQL的JSONB字段
解决方案
你可以通过SQLQueryString实现参数绑定的安全查询,同时完全兼容常规Fluent filter条件的组合使用。
实现代码
首先需要引入SQLKit依赖:
import SQLKit
具体查询逻辑如下:
var query = MyTable.query(on: db) // jsonFilters为要过滤的jsonb键值对字典 for (key, value) in jsonFilters { // 使用bind语法绑定参数,避免SQL注入 let jsonFilter = SQLQueryString("metadata->>\(bind: key) = \(bind: value)") query = query.filter(.custom(jsonFilter)) } // 可继续拼接其他常规Fluent过滤条件,默认用AND逻辑连接 query = query.filter(\.$otherField == targetValue) // 执行查询 let result = try await query.all()
核心说明
\(bind: 参数)语法会自动将参数转为预编译SQL的占位符,不会直接拼接进SQL语句,从根源避免SQL注入风险,同时也自动处理了特殊字符转义问题。- 多次调用
filter方法默认使用AND逻辑拼接条件,无需手动处理AND字符串拼接,代码更简洁不易出错。 - 自定义SQL过滤条件和Fluent自带的类型安全过滤条件可以任意组合使用,互不影响。
如果需要多个json过滤条件使用OR逻辑连接,可以用分组方法实现:
query.group(.or) { orQuery in for (key, value) in jsonFilters { let jsonFilter = SQLQueryString("metadata->>\(bind: key) = \(bind: value)") orQuery.filter(.custom(jsonFilter)) } }
内容的提问来源于stack exchange,提问作者user2555515
相关产品推荐
相关产品推荐

