Golang中如何从MSSQL数据库查询动态构建JSON而无需定义结构体
Golang中如何从MSSQL数据库查询动态构建JSON而无需定义结构体 我想开发一个应用程序,用于提供带有数据网格的网页,该网格能够动态显示来自文本文件中未知SQL查询的结果。
应用场景:我们的顾问创建查询并将其存放在与Go程序相同目录的SQL.ini文件中。首次运行时,程序将请求SQL凭据信息,然后加密并保存到setup.ini文件中。
该程序可设置为服务或独立应用程序。
非常感谢对此查询的任何帮助,不希望使用C#实现。非常希望能用Go语言完成这个项目。
2 回复
当然可以!你可以动态创建一个映射(map),然后从中生成JSON字符串。例如:
package main
import (
"fmt"
"encoding/json"
)
func main() {
obj := map[string]interface{}{}
obj["hoge"] = "huga"
obj["Nombre"] = "Pepe"
obj["Sueldo"] = 10.25
fmt.Println(obj)
jsonString, _ := json.Marshal(obj)
fmt.Println(string(jsonString))
}
只需要根据你的.ini文件中的字段创建相应的obj对象即可…
希望对你有帮助!
更多关于Golang中如何从MSSQL数据库查询动态构建JSON而无需定义结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,你可以使用database/sql包结合encoding/json来动态构建JSON,而无需预定义结构体。以下是一个完整的示例,展示如何从MSSQL数据库执行动态查询并生成JSON输出。
步骤概述:
- 读取SQL查询从文件(例如SQL.ini)。
- 连接到MSSQL数据库(使用
github.com/denisenkom/go-mssqldb驱动)。 - 执行查询并获取行数据。
- 动态提取列信息并构建JSON对象。
- 输出JSON结果。
示例代码:
首先,确保安装MSSQL驱动:
go get github.com/denisenkom/go-mssqldb
然后,编写Go代码:
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"os"
"strings"
_ "github.com/denisenkom/go-mssqldb"
)
// 从文件读取SQL查询(示例函数,需根据实际文件调整)
func readQueryFromFile(filename string) (string, error) {
data, err := os.ReadFile(filename)
if err != nil {
return "", err
}
return strings.TrimSpace(string(data)), nil
}
func main() {
// 数据库连接参数(示例,需从setup.ini读取或用户输入)
server := "localhost"
port := 1433
user := "your_username"
password := "your_password"
database := "your_database"
// 构建连接字符串
connString := fmt.Sprintf("server=%s;port=%d;user id=%s;password=%s;database=%s;",
server, port, user, password, database)
// 连接到数据库
db, err := sql.Open("sqlserver", connString)
if err != nil {
log.Fatal("Error connecting to database:", err)
}
defer db.Close()
// 验证连接
err = db.Ping()
if err != nil {
log.Fatal("Error pinging database:", err)
}
// 从SQL.ini文件读取查询
query, err := readQueryFromFile("SQL.ini")
if err != nil {
log.Fatal("Error reading query from file:", err)
}
// 执行查询
rows, err := db.Query(query)
if err != nil {
log.Fatal("Error executing query:", err)
}
defer rows.Close()
// 获取列名
columns, err := rows.Columns()
if err != nil {
log.Fatal("Error getting columns:", err)
}
// 准备一个切片来存储所有行数据
var results []map[string]interface{}
// 创建一个切片来存储每行的值(作为interface{})
values := make([]interface{}, len(columns))
valuePtrs := make([]interface{}, len(columns))
for i := range values {
valuePtrs[i] = &values[i]
}
// 迭代行
for rows.Next() {
// 扫描行数据到valuePtrs
err := rows.Scan(valuePtrs...)
if err != nil {
log.Fatal("Error scanning row:", err)
}
// 创建当前行的map
rowMap := make(map[string]interface{})
for i, col := range columns {
val := values[i]
// 处理可能的nil值或其他类型转换
if b, ok := val.([]byte); ok {
rowMap[col] = string(b)
} else {
rowMap[col] = val
}
}
results = append(results, rowMap)
}
// 检查行迭代中的错误
if err = rows.Err(); err != nil {
log.Fatal("Error during rows iteration:", err)
}
// 将结果转换为JSON
jsonData, err := json.MarshalIndent(results, "", " ")
if err != nil {
log.Fatal("Error marshaling JSON:", err)
}
// 输出JSON(可用于网页数据网格)
fmt.Println(string(jsonData))
}
关键点说明:
- 动态列处理:使用
rows.Columns()获取查询结果的列名,然后通过interface{}切片和指针来扫描任意类型的值。 - JSON构建:每行数据存储为
map[string]interface{},其中键是列名,值是扫描到的数据。使用json.Marshal将其转换为JSON数组。 - 类型处理:代码中将
[]byte类型(如MSSQL中的varchar或text)转换为字符串,避免JSON输出中的base64编码。其他类型(如整数、浮点数)会保留原样。
使用示例:
假设SQL.ini文件包含查询:
SELECT id, name, age FROM users WHERE active = 1
运行程序后,输出将是JSON数组,例如:
[
{
"id": 1,
"name": "John Doe",
"age": 30
},
{
"id": 2,
"name": "Jane Smith",
"age": 25
}
]
这个JSON可以直接用于网页数据网格(如JavaScript中的DataTables库)动态显示。
注意事项:
- 确保数据库连接参数正确,并从setup.ini安全读取(示例中硬编码了参数,实际应替换为文件读取逻辑)。
- 错误处理是基本的,生产环境中需要更健壮的处理(如重试连接、日志记录)。
- 对于大型数据集,考虑分页或流式处理以避免内存问题。

