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输出。

步骤概述:

  1. 读取SQL查询从文件(例如SQL.ini)。
  2. 连接到MSSQL数据库(使用github.com/denisenkom/go-mssqldb驱动)。
  3. 执行查询并获取行数据。
  4. 动态提取列信息并构建JSON对象。
  5. 输出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中的varchartext)转换为字符串,避免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安全读取(示例中硬编码了参数,实际应替换为文件读取逻辑)。
  • 错误处理是基本的,生产环境中需要更健壮的处理(如重试连接、日志记录)。
  • 对于大型数据集,考虑分页或流式处理以避免内存问题。
回到顶部