登录
首页 >  Golang >  Go问答

连接和查询数据

来源:stackoverflow

时间:2024-02-29 10:33:25 299浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《连接和查询数据》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

假设我有两个表,它们共享一些列名称,例如:

table_1
    - id
    - created_at
    - deleted_at
    - name
    - color

table_2
    - id
    - created_at
    - deleted_at
    - address
    - name

当我对这两个表运行联接查询时,我得到如下结果:

id, created_at, name, color, id, created_at, deleted_at, address, name

我有 2 个类似于我上面描述的模型的结构。现在我想将结果扫描到结果结构中:

type Result struct {
   Model1
   Model2
}

然后我使用 db.raw().scan(&result)。现在的问题是: idtable_2 永远不会写入表 2 的结构体,仅写入结果结构体中表 1 的结构体。

我的问题是:当存在名称相同的列时,如何将 join 查询的结果读取到结果结构中。


解决方案


我不知道这在 gorm v1 中是否可行,但在 v2 中,您可以使用带有前缀的 Embedded Structs 来消除两个结果集的歧义,然后您可以适当地命名列以将它们定向到正确的嵌入模型:

type Model1 struct {
    ID    int `gorm:"primaryKey"`
    Value string
}

type Model2 struct {
    ID    int `gorm:"primaryKey"`
    Value string
    Color string
}

type Result struct {
    Model1 `gorm:"embedded;embeddedPrefix:m1_"`
    Model2 `gorm:"embedded;embeddedPrefix:m2_"`
}

res := Result{}
db.Raw(`
    SELECT
        1 AS m1_id,
        'one' AS m1_value,
        2 AS m2_id,
        'two' AS m2_value,
        'rose' AS m2_color
`).Scan(&res)

fmt.Printf("%+v\n", res)
// {Model1:{ID:1 Value:one} Model2:{ID:2 Value:two Color:rose}}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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