登录
首页 >  Golang >  Go问答

Go SQL映射1:M关系json数组到切片

来源:stackoverflow

时间:2024-02-26 20:45:26 339浏览 收藏

一分耕耘,一分收获!既然都打开这篇《Go SQL映射1:M关系json数组到切片》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我有一个 product-image (1:m) 关系,基本上我想将这些图像映射到我的结构中的一个切片。我正在使用 sqlx 库来使其更容易一些。

我搜索了一段时间,也许最好的答案就在这个线程中:efficiently mapping one-to-many many-to-many database to struct in golang。 创建视图并将所有内容作为 json 返回的答案是有效的,但感觉有点hacky。

理想情况下,我想要做的是使用 postgres json_agg 返回图像列内与我的类型匹配的 json 数组,以便我可以扫描它。

我用nodejs做了好几次,但这里我不知道怎么做。我是否需要实现自定义 scanvalue 方法,或者是否有更简单的方法。我没有展示这一点,但我也有一个 1:1 的类别,我可以将该类别嵌入产品中并执行左连接,它适用于 sqlx,但不适用于图像类型。

简化模型

type image struct {
  id int,
  url string,
  productid int
}

type imagelist []*image

type product struct {
  id int `db:"id"`
  name string `db:"name"`
  images imagelist `db:"images"`
}

数据库表

create table product (
  id int generated always as identity primary key,
  name varchar(255),
);

create table product_image (
  id int generated always as identity primary key,
  url text not null,
  product_id int references product(id)
);

我现在正在尝试这样的事情:

q := `SELECT 
      p.*,
      COALESCE(JSON_AGG(img.*) FILTER (WHERE img.product_id IS NOT NULL), '[]'::json) AS images
      FROM product p
      LEFT JOIN product_image img ON p.id = img.product_id
      WHERE p.id = 1
      GROUP BY p.id`

var p Product
if err := sqlxdb.Get(&p, q); err != nil {
    fmt.Printf("Error: %v\n", err)
}

我收到此错误:

sql:列索引 26 上扫描错误,名称“images”:不支持扫描,将 driver.value 类型 []uint8 存储到类型 *model.imagelist

这似乎是一个非常常见的场景,但我找不到任何例子...... 或者最后我什至愚蠢地这样做,因为我可以在 js 中执行 foreach 并执行 50 个查询来获取每个产品的所有图像。


解决方案


可以使用此映射库来完成获取项目列表的一种解决方案:carta

q := `SELECT p.*, img.id AS img_id, img.url AS img_url 
      FROM public.product p
      LEFT JOIN product_image img ON p.id = img.product_id`

    rows, err := sqlxdb.Query(q)
    if err != nil {
        fmt.Println(err)
    }

    var products []*model.Product
    carta.Map(rows, &products)

对于 img 结构,我将使用 db:"img_id" 前缀等,因为我选择别名...

理论要掌握,实操不能落!以上关于《Go SQL映射1:M关系json数组到切片》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>