如何将MSSQL查询结果转换为map[string]string或动态结构体?
Go语言将SQL查询结果转为map[string]string
常规实现(已知列名)
直接在rows.Next()循环中声明对应列的变量,通过rows.Scan()提取数据后存入map即可,这是最直观的方式:
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" // 根据数据库类型替换驱动 ) func main() { // 初始化数据库连接(DSN格式根据数据库调整) db, err := sql.Open("mysql", "user:pass@tcp(127.0.0.1:3306)/test_db") if err != nil { panic(err) // 实际项目建议返回错误而非panic } defer db.Close() // 执行查询(注意key是SQL关键字,需用反引号包裹) rows, err := db.Query("SELECT customer, `key` FROM customer_keys") if err != nil { panic(err) } defer rows.Close() // 初始化目标map customerMap := make(map[string]string) // 遍历结果集 for rows.Next() { var customer, key string // 按查询列的顺序扫描值到变量 if err := rows.Scan(&customer, &key); err != nil { panic(err) } // 存入map customerMap[customer] = key } // 检查遍历过程中的错误 if err := rows.Err(); err != nil { panic(err) } // 输出结果 fmt.Println(customerMap) // 格式如 map[A:12345 B:6789] }
注意点
key是SQL保留字,查询时需要用反引号(MySQL)、双引号(PostgreSQL)或方括号(SQL Server)包裹,避免语法错误。rows.Scan()的参数顺序必须和查询语句中列的顺序完全一致。- 实际项目中不要用
panic,应该将错误向上传递并处理。
通用动态方案(不依赖列名)
如果你需要一个通用方法,不管查询的列名是什么,只要结果集有两列,就把第一列作为key、第二列作为value存入map,可以用interface{}接收值后做类型转换:
func queryToKVMap(db *sql.DB, query string) (map[string]string, error) { rows, err := db.Query(query) if err != nil { return nil, err } defer rows.Close() // 检查结果集列数是否符合要求 cols, err := rows.Columns() if err != nil { return nil, err } if len(cols) < 2 { return nil, fmt.Errorf("query result requires at least 2 columns") } result := make(map[string]string) for rows.Next() { var keyVal, valVal interface{} // 扫描第一、第二列的值 if err := rows.Scan(&keyVal, &valVal); err != nil { return nil, err } // 转换为string类型(若数据库列是其他类型,需额外处理,比如用strconv转换) keyStr, ok := keyVal.(string) if !ok { return nil, fmt.Errorf("first column value is not string type") } valStr, ok := valVal.(string) if !ok { return nil, fmt.Errorf("second column value is not string type") } result[keyStr] = valStr } // 检查遍历错误 if err := rows.Err(); err != nil { return nil, err } return result, nil }
使用示例
func main() { // 初始化db连接... mapResult, err := queryToKVMap(db, "SELECT customer, `key` FROM customer_keys") if err != nil { // 处理错误 } fmt.Println(mapResult) }
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

