duanji9481 2017-04-12 10:51
浏览 439
已采纳

Go中的函数在数据库上执行选择查询并返回json输出

I am writing a function in Go to execute select query on database.

Input: String e.g. "Select id, name, age from sometable" This query changes everytime.

Output: Output of select query in json format.

Sample Expected output: {"Data":[{"id":1,"name":"abc", "age":40},{"id":2,"name":"xyz", "age":45}]}

Sample Actual output: {"Data":[[1,"abc",40],[2,"xyz",45]]}

Instead of i.e. column_name:value, I get only values. How do I get the expected output?

func executeSQL(queryStr string) []byte {
connString := createConnectString()
conn, err := sql.Open("mssql", connString)
if err != nil {
    log.Fatal("Error while opening database connection:", err.Error())
}
defer conn.Close()

rows, err := conn.Query(queryStr)
if err != nil {
    log.Fatal("Query failed:", err.Error())
}
defer rows.Close()

columns, _ := rows.Columns()
count := len(columns)

var v struct {
    Data []interface{} // `json:"data"`
}

for rows.Next() {
    values := make([]interface{}, count)
    valuePtrs := make([]interface{}, count)
    for i, _ := range columns {
        valuePtrs[i] = &values[i]
    }
    if err := rows.Scan(valuePtrs...); err != nil {
        log.Fatal(err)
    }
    v.Data = append(v.Data, values)
}
jsonMsg, err := json.Marshal(v)
return jsonMsg
}
  • 写回答

2条回答 默认 最新

  • douqulv6059 2017-04-12 11:36
    关注

    Got the solution. Here is what I did.

    func executeSQL(queryStr string) []byte {
    connString := createConnectString()
    conn, err := sql.Open("mssql", connString)
    if err != nil {
        log.Fatal("Error while opening database connection:", err.Error())
    }
    defer conn.Close()
    
    rows, err := conn.Query(queryStr)
    if err != nil {
        log.Fatal("Query failed:", err.Error())
    }
    defer rows.Close()
    
    columns, _ := rows.Columns()
    count := len(columns)
    
    var v struct {
        Data []interface{} // `json:"data"`
    }
    
    for rows.Next() {
        values := make([]interface{}, count)
        valuePtrs := make([]interface{}, count)
        for i, _ := range columns {
            valuePtrs[i] = &values[i]
        }
        if err := rows.Scan(valuePtrs...); err != nil {
            log.Fatal(err)
        }
    
    //Created a map to handle the issue
        var m map[string]interface{}
        m = make(map[string]interface{})
        for i := range columns {
            m[columns[i]] = values[i]
        }
        v.Data = append(v.Data, m)
    }
    jsonMsg, err := json.Marshal(v)
    return jsonMsg
    }
    

    Let me know if there exists a better solution.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器