使用Fluent将请求JSON存入PostgreSQL表遇类型错误求解决方案
解决请求JSON体存入PostgreSQL的类型不匹配问题
直接获取请求完整JSON
Vapor的Request内置了content.json方法,可直接拿到请求体的完整JSON对象,无需手动转换为Data:let fullJson = try req.content.json修正更新代码
将原来的Data类型替换为JSON类型赋值,避免bytea与json/jsonb的类型冲突:do { let fullJson = try req.content.json try await Scan.query(on: req.db) .set(\.$json, to: fullJson) .filter(\.$unitId == unitID) .update() } catch { // 处理解析或数据库更新错误 }同时保存部分JSON内容
如果需要提取请求体中的部分字段并存入,可先解析部分内容,再结合完整JSON执行更新:do { // 提取请求体中的目标字段 let partialField = try req.content.get(String.self, at: "targetKey") // 获取完整JSON体 let fullJson = try req.content.json try await Scan.query(on: req.db) .set(\.$partialField, to: partialField) .set(\.$json, to: fullJson) .filter(\.$unitId == unitID) .update() } catch { // 错误处理 }关于jsonb类型的使用
Fluent完全支持PostgreSQL的jsonb类型,只需将模型中的字段定义从.json改为.jsonb即可,JSON类型依然可以直接赋值:.field("json", .jsonb)之前的报错并非Fluent对jsonb支持不足,而是传入了错误的
Data类型导致的。
内容的提问来源于stack exchange,提问作者Jstaud
相关产品推荐
相关产品推荐

