【问题标题】:sqlx Unable to use Struct Scan with nested structssqlx 无法对嵌套结构使用结构扫描
【发布时间】:2021-06-28 17:38:56
【问题描述】:

我有不同的 REST API 类型,它们有一些共同点:

  1. 所有类型都有Id
  2. 所有类型都有类型
  3. 所有类型都有属性,但属性不同

因为我不希望有大量不必要的类型,所以我想出了一种类型格式,但似乎不能被 sqlx 扫描。

type Pool struct {
   Id *string `json:"id" db:"pool_id"`
   Type *string `json:"type"`
   Attributes struct {
       Name *string `json:"name" db:"name"`
       Description *string `json:"description" db:"description"`
   } `json:"attributes"`
}

type User struct {
   Id *string `json:"id" db:"user_id"`
   Type *string `json:"type"`
   Attributes struct {
       FirstName *string `json:"first_name" db:"first_name"`
       LastName *string `json:"last_name" db:"last_name"`
   } `json:"attributes"`
}

尝试将 SQL 结果加载到变量中时出现错误:missing destination name name in *main.Pool

package main

import (
    _ "github.com/jmoiron/sqlx"
)

func selectOne() interface{} {
    pa := Pool{}
    err := dbx.Get(&pa, "SELECT * FROM pools LIMIT 1")
    if err != nil {
        panic(err)
    }

    return pa
}

由于名称存在,我不明白为什么这不起作用。非常感谢任何如何解决这个问题的建议!

【问题讨论】:

  • SQL 结果是一组列,而不是分层结构的数据。 sqlx 将列映射到结构字段。如果你想做这样的事情,你可以嵌入你的公共属性而不是让它成为一个字段(虽然在你的例子中使用匿名类型,但不清楚你为什么要这样做)。
  • 我正在尝试这样做,以便能够通过编组具有给定类型的变量来提供正确的 JSON API 输出。非常欢迎其他解决方案。
  • 如果您的 JSON 是分层结构的并且来自扁平的非结构化源(如 SQL),您可能需要使用单独的类型来表示每个。
  • 你找到解决这个问题的方法了吗?
  • Attributes 是另一个 sql 表吗?如果是,那么你需要在你的 sql 查询中加入它

标签: go


【解决方案1】:
package main

import (
    _ "github.com/jmoiron/sqlx"
)

   
func selectOne() interface{} {
    pa := Pool{}
    err := dbx.Get(&pa, `SELECT p.id, p.type, a.name AS "attributes.name" FROM pools p left join attributes a on a.p LIMIT 1`)
    if err != nil {
        panic(err)
    }
    return pa
}

【讨论】:

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