在数据库行中在Golang中创建一个Map

luc*_*iet 23 database variadic-functions go

基本上在执行查询之后我想获取结果行并生成一个[]map[string]interface{},但我不知道如何使用API​​执行此操作,因为该Rows.Scan()函数需要一个特定数量的参数来匹配所请求的列数(可能还有类型)以及)正确获取数据.

同样,我想概括这个调用并接受任何查询并将其转换为a []map[string]interface{},其中map包含映射到该行的值的列名.

这可能非常低效,我计划稍后更改结构,这interface{}是单个数据点的结构.

我如何仅使用database/sql包,或者如果需要使用database/sql/driver包?

eli*_*rar 12

看看使用sqlx,它比标准的数据库/ sql库更容易做到这一点:

places := []Place{}
err := db.Select(&places, "SELECT * FROM place ORDER BY telcode ASC")
if err != nil {
    fmt.Printf(err)
    return
}
Run Code Online (Sandbox Code Playgroud)

您显然可以替换[]Place{}为a []map[string]interface{},但如果您知道数据库的结构,最好使用结构.您不需要像对待任何类型的断言那样进行任何类型的断言interface{}.

  • "你显然可以用[] map [string]界面替换[] Place {} ......你确定吗?你测试过吗?我正在尝试使用地图,我收到一个错误:"错误目标必须是结构类型." (10认同)
  • 我不认为使用地图是非常罕见的.我想使用map的原因是我不想使用struct.我不想对查询结果集的字段做任何假设. (8认同)
  • 如果它对任何人都很重要,那么`structs`比`maps`更便宜,更安全.https://talks.golang.org/2012/10things.slide#2 (6认同)
  • @ rem7必须是该库的限制.但是,您很少想要使用地图进行数据库选择:您应该几乎总是知道结构. (3认同)
  • 当然,它们更便宜,更安全,但这并不意味着它们在客观上“更好”,因为……它们是完全不同的野兽。映射允许您存储任意键和值,当您拥有...任意数据时,这是必需的,例如,在构建用于SQL查询的应用程序时可以使用任意数据。结构只是连续的内存,就像一个数组,因此,它们当然是“便宜” :) (2认同)