我正在寻找如何从请求中捕获整个JSON主体并将其与一些JSON内容沿着保存到PSQL表的建议。我为json定义了一个列:
.field(.string("json"), .json)
我尝试将数据保存到数据库中,但似乎无法满足.json类型要求。我继续看到此错误:
服务器:列“json”的类型为jsonb,但表达式的类型为bytea(transformAssignedExpr)
当使用此函数转换JSON时:
if let reqData: Data = req.body.string?.data(using: .utf8) {
try await Scan.query(on: req.db)
.set(\.$json, to: reqData)
.filter(\.$unitId == unitID)
.update()
}
我确信问题出在我转换req.body.string?.data(using: .utf8)
的方式上,我一直在摆弄Request类中的一些其他方法,但不知道是否有一个内置的方法,或者我是否需要做更多的工作来执行转换。我一直在寻找这方面的一些资源,我“I“我很坚韧找到更多关于这方面的常见做法的信息。
我最初也尝试使用jsonb类型,但是为了简单起见,我现在坚持使用json类型,因为Fluent并不真正支持jsonb。
先谢了!
1条答案
按热度按时间oewdyzsn1#
经过大量的寻找一个简单的方法来做到这一点,它似乎是唯一的方法,使这项工作是:将整个JSON解码为自定义数据类型(swift模型,而不是Fluent模型),该数据类型准确地表示JSON结构并符合
PostgresJSONBCodable
或PostgresJSONCodable
,具体取决于您希望如何存储它。一旦有了数据存储机制,就可以将JSON解码为(swift)模型,然后将其编码为
PostgresData(jsonb: <#T##Data#>)
,然后进行数据库查询以更新数据库。这给处理结构未知的动态JSON查询带来了巨大的挑战,但幸运的是,这里的情况并非如此,我可以严格定义数据结构。
我正在使用从这些来源中找到的信息片段来做出这一决定: