首页 > 后端开发 > Golang > 正文

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

WBOY
发布: 2024-02-14 14:48:09
转载
466人浏览过

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 语言结构体

立即学习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 的新手,我想获得有关如何解决此问题的任何提示。也许我选择了错误的方式。

ListenLeap
ListenLeap

AI辅助通过播客学英语

ListenLeap 217
查看详情 ListenLeap

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

解决方法

看起来返回的 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.
登录后复制

以上就是Golang sqlx 将多对多连接的右侧转换为数组的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号