You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:20:40