【问题标题】:Handling Dynamic Queries (cant scan into struct)处理动态查询(无法扫描到结构中)
【发布时间】:2025-12-02 01:25:01
【问题描述】:

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

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

select foo from table

也可以

select foo,bar,baz from table1

select x,y,z from table2

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

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

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

【问题讨论】:

    标签: go go-pg


    【解决方案1】:

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

    这是一个示例,其中查询结果被扫描到指向 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)
    }
    

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

    【讨论】:

    • 我不得不使用 lib/pq 从 go-pg 切换到 database/sql,这很完美。
    • 你也可以考虑使用sqlx而不是database/sql来获得更多功能jmoiron.github.io/sqlx
    最近更新 更多