使用 Golang 将 MySQL 表转储为 JSON

2024-03-20

正在用 Go 将 MySQL 快速转储到 JSON。但是我发现我从数据库检索的所有内容都是[]byte大批。因此,我将所有内容都编码为字符串,而不是本机 JSON 整数或布尔值。

代码的子集:

import (
    "encoding/json"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)


func dumpTable(w io.Writer, table) {
    // ...

    rows, err := Query(db, fmt.Sprintf("SELECT * FROM %s", table))
    checkError(err)
    columns, err := rows.Columns()
    checkError(err)

    scanArgs := make([]interface{}, len(columns))
    values   := make([]interface{}, len(columns))

    for i := range values {
        scanArgs[i] = &values[i]
    }

    for rows.Next() {
        err = rows.Scan(scanArgs...)
        checkError(err)

        record := make(map[string]interface{})

        for i, col := range values {
            if col != nil {
                fmt.Printf("\n%s: type= %s\n", columns[i], reflect.TypeOf(col))

                switch t := col.(type) {
                default:
                    fmt.Printf("Unexpected type %T\n", t)
                case bool:
                    fmt.Printf("bool\n")
                    record[columns[i]] = col.(bool)
                case int:
                    fmt.Printf("int\n")
                    record[columns[i]] = col.(int)
                case int64:
                    fmt.Printf("int64\n")
                    record[columns[i]] = col.(int64)
                case float64:
                    fmt.Printf("float64\n")
                    record[columns[i]] = col.(float64)
                case string:
                    fmt.Printf("string\n")
                    record[columns[i]] = col.(string)
                case []byte:   // -- all cases go HERE!
                    fmt.Printf("[]byte\n")
                    record[columns[i]] = string(col.([]byte))
                case time.Time:
                    // record[columns[i]] = col.(string)
                }
            }
        }

        s, _ := json.Marshal(record)
        w.Write(s)
        io.WriteString(w, "\n")
    }
}

我还需要将数据库表转储为 json,这是我的实现方法: (与本主题中的另一个答案不同,一切都不是字符串,这要归功于这个答案:https://stackoverflow.com/a/17885636/4124416 https://stackoverflow.com/a/17885636/4124416,我可以正确获取整数字段)

func getJSON(sqlString string) (string, error) {
    rows, err := db.Query(sqlString)
    if err != nil {
        return "", err
    }
    defer rows.Close()
    columns, err := rows.Columns()
    if err != nil {
        return "", err
    }
    count := len(columns)
    tableData := make([]map[string]interface{}, 0)
    values := make([]interface{}, count)
    valuePtrs := make([]interface{}, count)
    for rows.Next() {
        for i := 0; i < count; i++ {
          valuePtrs[i] = &values[i]
        }
        rows.Scan(valuePtrs...)
        entry := make(map[string]interface{})
        for i, col := range columns {
            var v interface{}
            val := values[i]
            b, ok := val.([]byte)
            if ok {
                v = string(b)
            } else {
                v = val
            }
            entry[col] = v
        }
        tableData = append(tableData, entry)
    }
    jsonData, err := json.Marshal(tableData)
    if err != nil {
        return "", err
    }
    fmt.Println(string(jsonData))
    return string(jsonData), nil 
}

这是一个示例输出:

[{"ID":0,"Text":"Zero"},{"ID":1,"Text":"One"},{"ID":2,"Text":"Two"}]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Golang 将 MySQL 表转储为 JSON 的相关文章

随机推荐

  • Django 测试并行 AppRegistryNotReady

    我试图了解如何与内存中的 sqlite3 并行运行 django 测试 我有具有该结构的 django 应用程序 gbook order tests init py test a1 py test b1 py utils py test a
  • 多次调用ToList会影响性能吗?

    我经常看到调用 ToList 会使查询每次都被执行 我对此有点困惑 那么在这种情况下 第二次调用 ToList 会使查询执行多次吗 在什么情况下查询会执行多次 This gets from database and ToList is al
  • .toLocaleString('fr-FR') 不显示空格数量,但在控制台中工作

    我使用 PHP 显示来自服务器的一些价格和数字 使用函数以法语进行格式化 然后我想使用Jquery在客户端做一些计算 我使用 toLocaleString fr FR 来格式化要显示的结果 它可以在控制台中运行 但不能在 DOM 中运行 这
  • 如何重用一些“Eclipse IDE 插件”创建 Eclipse RCP 应用程序?

    如何创建一个 RCP 应用程序 它看起来与 Eclipse IDE 完全相同 具有所有菜单 视图 对话框 这是一个例子 http richclientplatform blogspot com 2007 12 oil and gas ind
  • 显示内 100% 高度的 div:table-cell div

    我试图将 100 高度的 div 放入 display table cell div 中 但它似乎在 IE 中不起作用 IE 有什么解决办法吗 这是我的代码 div style display table row div style dis
  • 在“视图”中使用 ng-init 的替代方案?

    我正在尝试为我的应用程序创建一个 喜欢 功能 我希望能够将动态生成的数字的值设置为 喜欢计数 问题出在使用 ng init 因为文档说这是一个糟糕的方法 如何在 控制器 而不是 视图 中设置值 这是我到目前为止所拥有的
  • 使用触发器将源代码从云构建发布到存储桶时出错

    我正在尝试通过云构建触发器将 html 代码从一个云源存储库发布到 gcp 中的公共存储桶 但是 每次推送到主分支时 我都会在构建中收到以下错误 generic invalid argument generic invalid argume
  • iOS 音量控制的最佳实践?

    硬件音量控制 我试图了解对于大多数静音但偶尔发出声音的应用程序的最佳实践是什么 此类应用程序可以利用 iOS 设备上的侧面音量控制 并避免需要在 NSVolume 控件小部件中进行设计 我认为这不如硬件侧面音量控制那么方便 该方法适用于 M
  • Ninject InRequestScope 缺失

    有几个关于 ninject 最新版本 2 2 1 4 的问题 正在尝试绑定 Linq2sqlDataContext到具体实施InRequestScope 在类库项目中 Bind
  • 在动态控件的 GridView 中找不到控件

    我有一个网格视图 我在运行时将文本框添加到每个单元格 但是 我似乎无法使用访问这些控件findcontrol 以下是我将文本框添加到网格视图的方法 If e Row RowType DataControlRowType DataRow Th
  • 对象是引用类型还是值类型?

    我仍然有疑问object 它是任何事物 任何类的主要基类 但它是引用类型还是值类型 或者喜欢这些行为中的哪一个呢 我需要澄清这一点 我很难理解这一点 object obj1 OldString object obj2 obj1 obj1 N
  • 更改视图、plot3D、Julia 语言(类似于 matplotlib)

    我正在尝试改变 3D 散点图的视角 朱莉娅语言 例如 此代码更改了视角 但每次更改时都会单独绘制点 而不是一起绘制 for i 1 10 X i Y i 2 Z i 3 fig figure ax gca projection 3d plo
  • 在 Spring Boot 中从属性文件注入值数组

    好的 所以我有一个config properties market curpairs 0 name EuroDollar market curpairs 0 symbol EURUSD market curpairs 0 minamount
  • Ryacas 的符号矩阵乘法

    我定义两个矩阵mat1 and mat2 in Sym适合 Ryacas 符号计算的类 library Ryacas x lt Sym x mat1 lt List List x 2 List x 3 x and mat2 lt List
  • 处理路径长度的问题

    我正在创建一个库 用于在 Linux 和 Windows 上进行文件操作 所以我需要处理路径 主要要求是我的函数将接收 UTF8 格式的字符串 但这会导致一些问题 其中之一是我正在使用MAX PATH在窗户上和PATH MAX在linux中
  • 为什么vscode中与“Reload Window”绑定的按键“Ctrl + R”不Reload Window?

    我是 vscode 的新用户 我遇到了一个问题 我被告知可以通过 重新加载窗口 解决 所以我首先通过 命令面板 找到它 它确实解决了我的问题 但是 我注意到它说它绑定到 Ctrl R 那么 如果这是它所绑定的键序列 为什么按住 Ctrl 并
  • 使用 Getopt::Long 时出现错误“panic: attempts to copy freed scalar”

    我收到错误 panic attempt to copy freed scalar a121fb4 to a156be8 at p pl line 13 当我运行以下程序时 p pl use warnings use strict use G
  • 应用程序spyder启动可能会产生错误窗口

    在我的Windows 10中 当我尝试通过anaconda navigator打开spyder时 会发生这种情况 Application spyder launch may have produced errors Traceback mo
  • 在 PHP 中使用冒号属性解析 XML

    我有以下 XML 结构
  • 使用 Golang 将 MySQL 表转储为 JSON

    正在用 Go 将 MySQL 快速转储到 JSON 但是我发现我从数据库检索的所有内容都是 byte大批 因此 我将所有内容都编码为字符串 而不是本机 JSON 整数或布尔值 代码的子集 import encoding json datab