You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:03