在我的golang应用程序中,我需要对MySQL进行SQL查询以获取单行并将结果放入map [string] string键中,这些键是列名。
但是我不知道列将是什么。查询就像
SELECT * FROM mytable
我使用“数据库/ sql”。
我发现只有扫描功能
db.QueryRow("SELECT * FROM mytable").Scan(&var1, &var2,...)
但这不适用于我的情况。我不知道会有多少个变量。而且我还需要列名。
是否可以使用数据库/ sql?
更新。我找到了解决部分问题的方法。如何从结果集中获取列名。
rows, err := db.Query(sqlcommand)
cols, err := rows.Columns()
所以,我可以用来制作地图的钥匙。但是我仍然不知道如何获得价值。因为,值可以具有不同的类型。
data = make(map[string]string)
if rows.Next() {
columns := make([]interface{}, len(cols))
columnPointers := make([]interface{}, len(cols))
for i, _ := range columns {
columnPointers[i] = &columns[i]
}
err = rows.Scan(columnPointers...)
for i, colName := range cols {
// value is in columns[i] of interface type.
// How to extract it from here?
// ....
data[colName] = val
}
}
P.S。这个问题不是“在mysql中获取表列名称? “。我想获取返回的数据集的列,而不仅仅是一个表。
答案 0 :(得分:2)
您似乎在正确的轨道上。根据{{3}}的定义,您可以提供所需目标类型的值,此处为string
。因此,将columns
的类型更改为[]string
应该可以:
var db sql.DB
var sqlcommand string
rows, _ := db.Query(sqlcommand)
cols, _ := rows.Columns()
data := make(map[string]string)
if rows.Next() {
columns := make([]string, len(cols))
columnPointers := make([]interface{}, len(cols))
for i, _ := range columns {
columnPointers[i] = &columns[i]
}
rows.Scan(columnPointers...)
for i, colName := range cols {
data[colName] = columns[i]
}
}