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

如何配置sqlc生成[]B结构体替代[]byte?(PostgreSQL+Golang)

让sqlc把PostgreSQL JSON数组映射成结构体切片的方案

这里有两种靠谱的方法,能帮你把b_data字段从[]byte改成[]B类型:

方法一:用SQL注释指定自定义类型

  1. 先定义B结构体:在你的SQL查询文件里,用sqlc:type指令声明B结构体:
-- sqlc:type
type B struct {
    BID  uuid.UUID `json:"b-bid"`
    Name string    `json:"b-name"`
}
  1. 修改查询语句:给b_data列加个sqlc:type="[]B"的注释,告诉sqlc这个列要映射成B的切片:
SELECT 
    a.a_id, 
    a.column1, 
    COALESCE(
        json_agg(
            json_build_object(
                'b-bid', b.b_id,
                'b-name' , b.name
            )
        ) FILTER (WHERE b.a_id IS NOT NULL),
        '[]'
    )::json AS b_data -- sqlc:type="[]B"
FROM 
    a
LEFT JOIN 
    b ON a.a_id = b.a_id
WHERE 
    a.column1 = $1
GROUP BY 
    a.a_id;
  1. 配置sqlc.yaml(按需添加):如果sqlc没自动识别到类型映射,就在配置文件里明确指定:
version: "2"
sql:
  - schema: "./schema.sql"
    queries: "./queries.sql"
    engine: "postgresql"
    gen:
      go:
        package: "db"
        out: "./db"
        overrides:
          - db_type: "json"
            go_type:
              type: "[]B"
              package: "your/project/db" # 换成你的实际包路径

执行sqlc生成命令后,GetAByIdRow里的BData就会变成[]B类型了。

方法二:手动写类型转换(备选)

要是方法一用不了,也可以在生成的代码外面套一层转换逻辑,把[]byte转成[]B:

type GetAByIdRowWithBData struct {
    AId     uuid.UUID   `json:"a_id"`
    Column1 pgtype.Text `json:"column1"`
    BData   []B         `json:"b_data"`
}

func (row *GetAByIdRow) ToTypedRow() (*GetAByIdRowWithBData, error) {
    var bData []B
    if err := json.Unmarshal(row.BData, &bData); err != nil {
        return nil, err
    }
    return &GetAByIdRowWithBData{
        AId:     row.AId,
        Column1: row.Column1,
        BData:   bData,
    }, nil
}

这种方式不用改sqlc配置,适合快速适配现有代码。

内容的提问来源于stack exchange,提问作者advies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:29:50