处理动态查询(无法扫描到结构中)
Handling Dynamic Queries (cant scan into struct)
在查询结构是静态的情况下使用 go-pg - querying/scanning 直接进入已知结构就像做梦一样。但是,我正在努力处理动态查询 - 那些没有要扫描到的结构的查询。
例如,根据某些 运行 时间参数 - 查询可能如下所示:
select foo from table
或者可能是
select foo,bar,baz from table1
或
select x,y,z from table2
我一直在尝试弄清楚如何将结果加载到地图中。下面的代码抛出错误 "invalid character '\' looking for beginning of value"
m := make(map[string]interface{})
_,err:=db.Query(&m, "select foo,bar from table1")
if err!=nil{
fmt.Println(err)
}
我刚刚开始学习围棋 - 完全迷路了。关于如何处理动态查询的任何提示
您可以通过首先将数据库行值扫描到一个切片中,然后构建一个包含行值的映射来实现这一点。
这是一个示例,其中查询结果被扫描到指向接口{}类型变量的指针切片中。
sql := "select foo,bar from table1"
rows, err := db.Query(sql)
columns, err := rows.Columns()
// for each database row / record, a map with the column names and row values is added to the allMaps slice
var allMaps []map[string]interface{}
for rows.Next() {
values := make([]interface{}, len(columns))
pointers := make([]interface{}, len(columns))
for i,_ := range values {
pointers[i] = &values[i]
}
err := rows.Scan(pointers...)
resultMap := make(map[string]interface{})
for i,val := range values {
fmt.Printf("Adding key=%s val=%v\n", columns[i], val)
resultMap[columns[i]] = val
}
allMaps = append(allMaps, resultMap)
}
为简洁起见,不对任何错误执行错误检查。
在查询结构是静态的情况下使用 go-pg - querying/scanning 直接进入已知结构就像做梦一样。但是,我正在努力处理动态查询 - 那些没有要扫描到的结构的查询。
例如,根据某些 运行 时间参数 - 查询可能如下所示:
select foo from table
或者可能是
select foo,bar,baz from table1
或
select x,y,z from table2
我一直在尝试弄清楚如何将结果加载到地图中。下面的代码抛出错误 "invalid character '\' looking for beginning of value"
m := make(map[string]interface{})
_,err:=db.Query(&m, "select foo,bar from table1")
if err!=nil{
fmt.Println(err)
}
我刚刚开始学习围棋 - 完全迷路了。关于如何处理动态查询的任何提示
您可以通过首先将数据库行值扫描到一个切片中,然后构建一个包含行值的映射来实现这一点。
这是一个示例,其中查询结果被扫描到指向接口{}类型变量的指针切片中。
sql := "select foo,bar from table1"
rows, err := db.Query(sql)
columns, err := rows.Columns()
// for each database row / record, a map with the column names and row values is added to the allMaps slice
var allMaps []map[string]interface{}
for rows.Next() {
values := make([]interface{}, len(columns))
pointers := make([]interface{}, len(columns))
for i,_ := range values {
pointers[i] = &values[i]
}
err := rows.Scan(pointers...)
resultMap := make(map[string]interface{})
for i,val := range values {
fmt.Printf("Adding key=%s val=%v\n", columns[i], val)
resultMap[columns[i]] = val
}
allMaps = append(allMaps, resultMap)
}
为简洁起见,不对任何错误执行错误检查。