【问题标题】:How to scan into nested structs with sqlx?如何使用 sqlx 扫描嵌套结构?
【发布时间】:2021-09-05 00:47:24
【问题描述】:

假设我有两个模型,

    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,
    )

【问题讨论】:

    标签: postgresql go sqlx


    【解决方案1】:

    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 列。(看来您是从代码 sn-p 中编辑的)

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      相关资源
      最近更新 更多