如何将sqlx查询结果转换为结构数组?

时间:2019-06-22 18:23:02

标签: go sqlx

我正在尝试从没有条件的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)
    }

预期结果:

--- CustomData {1,x,x,x,x} -CustomData {2,x,x,x,x}

实际:   没事..

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

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

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

答案 1 :(得分:1)

  1. 您不需要在查询中重命名字段,因为您是在struct标记中定义了实际的DB字段。

  2. 如果要直接扫描到CustomData的切片,并且使用的是SQLX,则应使用特定于SQLX的Select方法,而不是常规的SQL查询。从图示的SQLX指南(https://jmoiron.github.io/sqlx/#getAndSelect)中稍微修改了相关示例:

res.currency
Dependency Tree Calculated 5 times

所以在您的情况下:

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