在Go语言中,db.QueryRow.Scan
函数不能直接将数据库查询结果扫描到 map
中。Scan
函数要求你将查询结果的每一列分别扫描到对应的变量中,这些变量通常是基本类型(如 int
, string
, time.Time
等)或指针类型。
如果你希望将查询结果存储到 map
中,你需要手动处理这个过程。以下是一个示例代码,展示了如何将查询结果存储到 map[string]interface{}
中:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
panic(err)
}
defer db.Close()
row := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", 1)
columns, err := row.Columns()
if err != nil {
panic(err)
}
values := make([]interface{}, len(columns))
for i := range values {
values[i] = new(sql.RawBytes)
}
err = row.Scan(values...)
if err != nil {
panic(err)
}
result := make(map[string]interface{})
for i, col := range columns {
result[col] = string(*values[i].(*sql.RawBytes))
}
fmt.Println(result)
}
row.Columns()
: 获取查询结果的列名。values := make([]interface{}, len(columns))
: 创建一个 []interface{}
切片,用于存储每一列的值。values[i] = new(sql.RawBytes)
: 为每一列分配一个 sql.RawBytes
类型的指针,用于存储原始字节数据。row.Scan(values...)
: 将查询结果扫描到 values
切片中。result := make(map[string]interface{})
: 创建一个 map
用于存储最终的查询结果。result[col] = string(*values[i].(*sql.RawBytes))
: 将每一列的值转换为字符串并存储到 map
中。int
, time.Time
等),你需要根据实际情况进行类型转换。db.Query
和 rows.Scan
,并在循环中处理每一行。虽然 db.QueryRow.Scan
不能直接将结果扫描到 map
中,但你可以通过手动处理列和值来实现这一功能。