【问题标题】:How to convert sqlx query results to an array of structs?如何将 sqlx 查询结果转换为结构数组?
【发布时间】:2019-06-24 03:07:16
【问题描述】:

我正在尝试从没有 where 条件的 postgres 表中查询所有结果,并在 sqlx db Query 的帮助下通过传递 args ...interface {} 将其映射到结构数组。

但是下面粘贴的代码永远行不通,而不是逐个迭代和扫描结果,是否有可能让下面的代码工作??

非常感谢您的意见。谢谢

type CustomData struct {
    ID                        string `db:"id" json:",omitempty"`
    Name                      string `db:"name" json:",omitempty"`
    Description               string `db:"description" json:",omitempty"`
    SourceID                  string `db:"sourceid" json:",omitempty"`
    StatusID                  string `db:"statusid" json:",omitempty"`
    StatusReason              string `db:"statusreason" json:",omitempty"`
    CreateTime                string `db:"createtime" json:",omitempty"`
    UpdateTime                string `db:"updatetime" json:",omitempty"`
}

var myData []CustomData

*sqlx.DB.Query("SELECT id as ID,  name as Name, description as Description, sourceid as SourceID, statusid as StatusID, statusreason as StatusReason, createtime as CreateTime, updatetime as UpdateTime FROM myschema.my_table", &myData)

// tried with following statement but din't work either
// *sqlx.DB.Query("SELECT * FROM myschema.my_table", &myData)

    for _, data := range myData {
        fmt.Println("--", data)
    }

预期结果:

--- 自定义数据{1,x,x,x,x} --- 自定义数据{2,x,x,x,x}

实际: 什么都没有。。

【问题讨论】:

    标签: go sqlx


    【解决方案1】:
    1. 您无需重命名查询中的字段,因为您在结构标签中定义了实际的 DB 字段。

    2. 如果您想直接扫描到 CustomData 的切片并且如果您正在使用 SQLX,您应该使用 SQLX 特定的 Select 方法,而不是通用的 SQL Query。稍微修改了 SQLX 图解指南中的相关示例 (https://jmoiron.github.io/sqlx/#getAndSelect):

        pp := []Place{}
        err = db.Select(&pp, "SELECT * FROM place")
    

    所以在你的情况下:

        myData := []CustomData
        err = db.Select(&myData, "SELECT * FROM myschema.my_table")
    

    【讨论】:

      【解决方案2】:

      您可以使用以下内容:

      for rows.Next() {
          s := CustomData{}
          if err := rows.Scan(&s); err != nil {
              return err
          }
          fmt.Println(s)
      }
      

      如果您喜欢代码优先方法,您可以始终将 ORM 库用作 gorm,如果您喜欢 DB 优先方法,则可以使用 sqlboiler

      【讨论】:

      • 感谢您的回复,但是在扫描时出现以下错误,s:"sql: expected 8 destination arguments in Scan, not 1" 。你能告诉我做错了什么吗?谢谢
      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多