【问题标题】:How to properly query Postgres JSONB field in Vapor/Fluent如何在 Vapor/Fluent 中正确查询 Postgres JSONB 字段
【发布时间】:2022-01-08 07:16:57
【问题描述】:

我有一个表,其中包含一些由迁移创建的 jsonb 列,如下所示:

    public func prepare(on database: Database) -> EventLoopFuture<Void> {
        return database.schema(MyTable.schema)
            .id()
            .field(.metadata, .custom("JSONB"), .required)
            .create()
    }

我正在尝试过滤 jsonb 字段上的查询。以下是一个有效的简单字符串插值。

//jsonFilters is a dictionary of key value pair for which we want to filter in jsonb field            
            
            var query = MyTable.query(on: db)
            var filterString  = ""
            var cycleCount = 0;
            jsonFilters.forEach({
                (key, value) in
                filterString +=
                "metadata->>'\(key)' = '\(value)' "
                cycleCount+=1
                if(cycleCount < filter.metadata!.count) {
                    filterString += " AND "
                }
            })
            query = query.filter(.custom(metadataString))
            // Also filter on something else.
            query = query.filter(....)

但是,这并不安全,并且存在 sql 注入漏洞。有没有办法绑定过滤器参数,例如使用 SQLQueryString?它应该与常规过滤器的其余部分一起使用。 (代码最后一行)​​

【问题讨论】:

    标签: fluent vapor


    【解决方案1】:

    以防万一有人在这里遇到同样的情况,使用 SQLQueryString 可以传递参数而不是字符串插值:

            var queryString = SQLQueryString("")
            var cycleCount = 0;
            filter.metadata!.forEach({
                (key, value) in
                
                queryString.appendLiteral("metadata->>")
                queryString.appendInterpolation(bind: key)
                queryString.appendLiteral(" = ")
                queryString.appendInterpolation(bind: value)
               
                cycleCount+=1
                if(cycleCount < filter.metadata!.count) {
                    queryString.appendLiteral(" AND ")
                }
            })
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2018-02-13
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多