如何配置sqlc生成[]B结构体替代[]byte?(PostgreSQL+Golang)
让sqlc把PostgreSQL JSON数组映射成结构体切片的方案
这里有两种靠谱的方法,能帮你把b_data字段从[]byte改成[]B类型:
方法一:用SQL注释指定自定义类型
- 先定义B结构体:在你的SQL查询文件里,用
sqlc:type指令声明B结构体:
-- sqlc:type type B struct { BID uuid.UUID `json:"b-bid"` Name string `json:"b-name"` }
- 修改查询语句:给
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;
- 配置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
相关产品推荐
相关产品推荐

