处理动态查询(无法扫描到结构中)

use*_*757 0 go go-pg

当使用查询结构是静态的 go-pg 时 - 直接查询/扫描到已知结构中就像做梦一样。但是,我正在努力处理动态查询 - 没有结构可以扫描的查询。

例如,根据一些运行时参数 - 查询可能如下所示:

select foo from table
Run Code Online (Sandbox Code Playgroud)

或者它可能是

select foo,bar,baz from table1
Run Code Online (Sandbox Code Playgroud)

或者

select x,y,z from table2
Run Code Online (Sandbox Code Playgroud)

我一直在试图弄清楚如何使用将结果加载到地图中。下面的代码抛出错误“无效字符 '\' 寻找值的开头”

m := make(map[string]interface{})
_,err:=db.Query(&m, "select foo,bar from table1")
if err!=nil{
   fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

我刚刚开始学习围棋 - 我完全迷路了。关于如何处理动态查询的任何提示

Ale*_*fel 5

您可以通过首先将数据库行值扫描到切片中,然后构建保存行值的映射来实现此目的。

这是一个示例,其中查询结果被扫描到指向 interface{} 类型变量的指针片段中。

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)
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,不对任何错误执行错误检查。