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

sqlc生成PostgreSQL关联查询代码时array字段返回异常问题

问题根因

PostgreSQL返回的artineve是int类型数组,但sqlc自动生成代码时无法识别该字段的具体类型,默认使用了interface{}接收,扫描时未对PostgreSQL数组格式做解析,最终JSON序列化时将原始的PostgreSQL数组二进制编码转为了base64字符串,就是你看到的ezIsMTh9这类异常值。

解决方案

方案1:修改sqlc配置实现自动生成正确代码(推荐,不会被后续sqlc generate覆盖)

  1. 打开你的sqlc.yaml配置文件,添加类型映射规则:
packages:
  - name: "db"
    path: "./db"
    queries: "./sql/queries/"
    schema: "./sql/schema/"
    engine: "postgresql"
    emit_json_tags: true
    # 新增以下类型映射配置
    overrides:
      # 匹配查询返回的artineve字段,映射为[]int64,扫描时自动使用pq.Array
      - column: "rslt.artineve"
        go_type:
          type: "[]int64"
        scan:
          type: "github.com/lib/pq.Array"

如果需要全局适配所有int数组类型,也可以配置通用规则:

overrides:
  - db_type: "int[]"
    go_type:
      type: "[]int64"
    scan:
      type: "github.com/lib/pq.Array"
  1. 重新执行sqlc generate,生成的代码会自动将Artineve字段类型改为[]int64,且扫描逻辑自动加上pq.Array包裹。

方案2:临时修改生成的Go代码(仅测试用,不推荐,后续重新生成会被覆盖)

  1. 修改GetAllEventsRow结构体中Artineve的字段类型:
type GetAllEventsRow struct {
    // 其余字段保持不变
    Artineve  []int64     `json:"artineve"` // 将interface{}修改为[]int64
}
  1. 修改rows.Scan部分的逻辑,对Artineve字段用pq.Array包裹扫描:
if err := rows.Scan(
    &i.Uid,
    &i.Name,
    &i.Sns,
    pq.Array(&i.Genre),
    &i.CreatedAt,
    pq.Array(&i.Artineve), // 新增pq.Array包裹
); err != nil {
    return nil, err
}

修改完成后重启服务,artineve字段就会返回[11, 3, 4]这类预期的整数数组格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:15:03