sqlc生成PostgreSQL关联查询代码时array字段返回异常问题
问题根因
PostgreSQL返回的artineve是int类型数组,但sqlc自动生成代码时无法识别该字段的具体类型,默认使用了interface{}接收,扫描时未对PostgreSQL数组格式做解析,最终JSON序列化时将原始的PostgreSQL数组二进制编码转为了base64字符串,就是你看到的ezIsMTh9这类异常值。
解决方案
方案1:修改sqlc配置实现自动生成正确代码(推荐,不会被后续sqlc generate覆盖)
- 打开你的
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"
- 重新执行
sqlc generate,生成的代码会自动将Artineve字段类型改为[]int64,且扫描逻辑自动加上pq.Array包裹。
方案2:临时修改生成的Go代码(仅测试用,不推荐,后续重新生成会被覆盖)
- 修改
GetAllEventsRow结构体中Artineve的字段类型:
type GetAllEventsRow struct { // 其余字段保持不变 Artineve []int64 `json:"artineve"` // 将interface{}修改为[]int64 }
- 修改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
相关产品推荐
相关产品推荐

