最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • Golang sqlx 将多对多连接的右侧转换为数组

    golang sqlx 将多对多连接的右侧转换为数组

    php小编西瓜在这篇文章中将为大家介绍Golang sqlx如何将多对多连接的右侧转换为数组。Golang是一种强大的编程语言,而sqlx是一个流行的Golang数据库工具。在使用sqlx进行多对多连接时,我们经常需要将右侧的结果转换为数组,以便更方便地进行处理和操作。本文将详细介绍如何使用sqlx和一些实例来演示这一过程,希望能对大家有所帮助。

    问题内容

    我有两张桌子
    具有 unit 外键的 unit 和 unitimage。

    我执行这个sql查询

    select un.*, array_agg(row(ui.is_main, ui.image, ui.id)) as unit_images
    from unit un
    inner join unitimage ui on ui.unit_id = un.id
    group by un.id;

    作为回应,我得到了所有单位字段并像这样加入了字段unit_images

    {"(f,photos/units/unit_37/90_big.jpg,108)","(f,photos/units/unit_37/91_big.jpg,109)","(f,photos/units/unit_37/92_big.jpg,110)","(f,photos/units/unit_37/93_big.jpg,111)"}

    go 语言结构体

    type unit struct {
        id                     *int         `json:"id" db:"id"`
        name                   *string      `json:"name" db:"name"`
        ... a lot of fields
        unitimages             []unitimages `json:"unit_images" db:"unit_images"`
    }
    
    type unitimages struct {
        id *int `json:"id" db:"id"`
        image  *string `json:"image" db:"image"`
        ismain *bool   `json:"is_main" db:"is_main"`
    }

    sqlx代码

    query := fmt.Sprintf("SELECT un.*, array_agg(ROW(ui.id, ui.image, ui.is_main)) as unit_images FROM %s un INNER JOIN %s ui ON ui.unit_id = un.id GROUP BY un.id",
    unitsTable, unitImagesTable)
    err := r.db.Select(&units, query)

    我收到错误 "sql: 列索引 45 上的扫描错误,名称 "unit_images": 不支持扫描,将 driver.value 类型 []uint8 存储到类型 *[]*unitimages"

    我是 golang 的新手,我想获得有关如何解决此问题的任何提示。也许我选择了错误的方式。

    我想知道解决此问题的正确方法。

    解决方法

    看起来返回的 sql 结果是:

    un.id | un.name | un.description | unit_images
    ------+---------+----------------+---------------------------------------------------------------------
    1     | unit a  | description a  | [(true, 'image1.jpg', 1), (false, 'image2.jpg', 2), (false, 'image3.jpg', 3)]
    2     | unit b  | description b  | [(true, 'image4.jpg', 4), (true, 'image5.jpg', 5), (false, 'image6.jpg', 6)]
    3     | unit c  | description c  | [(true, 'image7.jpg', 7), (false, 'image8.jpg', 8), (false, 'image9.jpg', 9)]

    所以

    `unitimages []unitimages `json:"unit_images" db:"unit_images"`

    这是正确的想法,您有一个 unitimages 数组。但是:

    id *int `json:"id" db:"id"`
        image  *string `json:"image" db:"image"`
        ismain *bool   `json:"is_main" db:"is_main"`

    请注意,idimageis_main 没有 sql 列,因此 go 无法映射它们。

    轻松修复将 unitimages 更改为 []any,然后自己将内容投射到该数组中,如下所示:

    for _, item := range thing.UnitImages {
      isMain := item[0].(bool)
      image := item[1].(string)
      id := item[2].(int64)
    
      //TODO do something with these vars
    }
    
    Or you could use `pg.StringArray` type.
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » Golang sqlx 将多对多连接的右侧转换为数组
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情