Golang服务器:发送JSON,其中包含具有可变列数的SQL查询结果
我正在用Go服务器创建RESTful API的一个小实现 我正在从URL中提取查询参数(我知道这不安全,稍后我会尝试解决这个问题,但如果您对这个主题有任何建议,它们会很有帮助) 我在3个sring变量中保存了表名、所需列和一些条件。 我正在使用此查询:Golang服务器:发送JSON,其中包含具有可变列数的SQL查询结果,sql,json,go,Sql,Json,Go,我正在用Go服务器创建RESTful API的一个小实现 我正在从URL中提取查询参数(我知道这不安全,稍后我会尝试解决这个问题,但如果您对这个主题有任何建议,它们会很有帮助) 我在3个sring变量中保存了表名、所需列和一些条件。 我正在使用此查询: rows, _ := db.Query(fmt.Sprintf("SELECT %s FROM %s WHERE %s", columns, table, conditions)) 我想将查询结果作为JSON发送回我的前端。我有可变数量的未知列
rows, _ := db.Query(fmt.Sprintf("SELECT %s FROM %s WHERE %s", columns, table, conditions))
我想将查询结果作为JSON发送回我的前端。我有可变数量的未知列,所以我不能用“标准”的方式。
我能想到的一个解决方案是从查询结果和rows.Columns()中“手动”构建JSON字符串
但我想用一种更实际的方式来做这件事,比如使用变量接口之类的东西。问题是,即使尝试了很多,我仍然不明白它是如何工作的
我尝试使用以下代码
cols, err := rows.Columns() // Get the column names; remember to check err
vals := make([]sql.RawBytes, len(cols)) // Allocate enough values
ints := make([]interface{}, len(cols)) // Make a slice of []interface{}
for i := range ints {
vals[i] = &ints[i] // Copy references into the slice
}
for rows.Next() {
err := rows.Scan(vals...)
// Now you can check each element of vals for nil-ness,
// and you can use type introspection and type assertions
// to fetch the column into a typed variable.
}
但它不起作用,我得到的错误如下
无法将&ints[i](type*接口{})用作赋值中的sql.RawBytes类型
即使它能起作用,我也不明白
有人有好的解决办法吗?一些解释也很好
非常感谢。第一个问题是: i:=范围整数的
{
vals[i]=&ints[i]//将引用复制到切片中
}
这是您设置要作为接口指针的RawBytes值
在我解释这意味着做什么之前,我会看看我是否能解释一下这里的总体想法
因此,通常在Go中从SQL获取响应时,每个列和类型(id int,name string,…)都有一个切片,这样就可以将每个SQL记录读入该切片,并且每个列都将映射到相同类型的值
对于像您这样的情况,您将从SQL获得更多的响应,并且需要处理它,您可以这样做:
i:=范围整数的{
ints[i]=&vals[i]//将引用复制到切片中
}
这意味着每个接口
值都有一个指向vals
数组的指针,该数组将保存来自SQL的响应。(在我的示例中,我使用[][]字节而不是RawBytes,因此vals
中的值将是来自SQL的字节值片段。)
然后你会做:
err:=行。扫描(ints…)
由于接口
可以计算为任何类型,因此当填充ints
数组时,它将接受任何值,然后根据指针将SQL中的值作为RawBytes类型更新VAL数组中的位置
嗯