微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 sqlx 扫描到嵌套结构?

如何解决如何使用 sqlx 扫描到嵌套结构?

假设我有两个模型,

    type Customer struct {
       Id      int     `json:"id" db:"id"`
       Name    string  `json:"name" db:"name"`
       Address Address `json:"adress"`
    }
    
    type Address struct {
       Street string `json:"street" db:"street"`
       City   string `json:"city" db:"city"`
    }

    // ...

    customer := models.Customer{}
    err := db.Get(&customer,`select * from users where id=$1 and name=$2`,id,name)

但是这次扫描会抛出一个错误missing destination name street in *models.Customer

我做错了吗?如您所见,我已经更新了与该值对应的数据库。我仔细检查了所以区分大小写应该不是问题。 还是无法使用 https://github.com/jmoiron/sqlx

我可以在文档中看到它,但仍然无法弄清楚如何解决它。 http://jmoiron.github.io/sqlx/#advancedScanning

users 表声明为:

    CREATE TABLE `users` (
      `id` varchar(256) NOT NULL,`name` varchar(150) NOT NULL,`street` varchar(150) NOT NULL,`city` varchar(150) NOT NULL,)

解决方法

very link you posted 提示您如何执行此操作:

StructScan 看似复杂。它支持嵌入式结构,并使用与 Go 用于嵌入式属性和方法访问相同的优先级规则分配给字段

因此,鉴于您的数据库架构,您可以简单地将 Address 嵌入到 Customer 中:

type Customer struct {
   Id     int    `json:"id" db:"id"`
   Name   string `json:"name" db:"name"`
   Address
}

在您的原始代码中,Address 是一个字段 ,带有自己的 db 标签。这是不正确的,顺便说一下,您的架构根本没有 address 列。(您似乎从代码片段中编辑了它)

通过将结构嵌入到 Customer 中,Address 字段(包括标签)被提升到 Customer 中,sqlx 将能够从您的查询结果中填充它们。>

警告:嵌入该字段也会使任何 JSON 编组的输出变平。它会变成:

{
    "id": 1,"name": "foo","street": "bar","city": "baz"
}

如果您想根据原始结构标记将 streetcity 放入 JSON address 对象中,最简单的方法可能是将 DB 结构重新映射到原始类型.

您也可以将查询结果扫描到 map[string]interface{} 中,但是您必须小心 how Postgres data types are represented in Go

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。