如何在不知道列的情况下从表中读取一行到地图

Rom*_*juk 8 go

在我的 golang 应用程序中,我需要对 MySQL 进行 SQL 查询以获取单行并将结果放入 map[string]string 键是列名。

但我不知道什么是列。查询就像

SELECT * FROM mytable
Run Code Online (Sandbox Code Playgroud)

我使用 "database/sql" 。

我发现只有扫描功能

db.QueryRow("SELECT * FROM mytable").Scan(&var1, &var2,...)
Run Code Online (Sandbox Code Playgroud)

但这对我的情况不起作用。我不知道会有多少变数。而且我还需要列名。

是否可以使用 database/sql ?

更新。我找到了如何解决这个问题的一部分。如何从结果集中获取列名。

rows, err := db.Query(sqlcommand)

cols, err := rows.Columns()
Run Code Online (Sandbox Code Playgroud)

所以,我可以用来制作地图的钥匙。但我仍然不知道如何获得价值。因为,值可以有不同的类型。

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
    }
}
Run Code Online (Sandbox Code Playgroud)

PS 这个问题与“Get table column names in mysql?”不重复。我想获取返回数据集的列,而不仅仅是一个表。

rob*_*obx 14

你似乎在正确的轨道上。根据 的定义Rows.Scan,您可以提供所需目标类型的值,这将在string此处。所以改变columnsto的类型[]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]
    }
}
Run Code Online (Sandbox Code Playgroud)