如何将 sqlx 查询结果转换为结构数组?
How to convert sqlx query results to an array of structs?
我正在尝试在没有 where 条件的情况下查询来自 postgres table 的所有结果,并在 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}
实际:
没什么..
您可以使用以下内容:
for rows.Next() {
s := CustomData{}
if err := rows.Scan(&s); err != nil {
return err
}
fmt.Println(s)
}
如果您喜欢 DB 优先方法
,您始终可以将 ORM 库用作 gorm if you like code first approach or sqlboiler
您不需要重命名查询中的字段,因为您是在结构标签中定义实际的数据库字段。
如果你想直接扫描到 CustomData 的切片并且你正在使用 SQLX,你应该使用 SQLX 特定的 Select 方法,而不是通用的 SQL 查询。将插图指南中的相关示例稍微修改为 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")
我正在尝试在没有 where 条件的情况下查询来自 postgres table 的所有结果,并在 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}
实际: 没什么..
您可以使用以下内容:
for rows.Next() {
s := CustomData{}
if err := rows.Scan(&s); err != nil {
return err
}
fmt.Println(s)
}
如果您喜欢 DB 优先方法
,您始终可以将 ORM 库用作 gorm if you like code first approach or sqlboiler您不需要重命名查询中的字段,因为您是在结构标签中定义实际的数据库字段。
如果你想直接扫描到 CustomData 的切片并且你正在使用 SQLX,你应该使用 SQLX 特定的 Select 方法,而不是通用的 SQL 查询。将插图指南中的相关示例稍微修改为 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")