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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:20:13