【问题标题】:How to read a row from a table to a map, Without knowing columns如何在不知道列的情况下从表中读取一行到地图
【发布时间】:2023-03-10 10:28:01
【问题描述】:

在我的 golang 应用程序中,我需要对 MySQL 进行 SQL 查询以获取单行并将结果放入 map[string]string 键是列名。

但我不知道什么是列。查询就像

SELECT * FROM mytable

我使用“数据库/sql”。

我发现只有扫描功能

db.QueryRow("SELECT * FROM mytable").Scan(&var1, &var2,...)

但这不适用于我的情况。不知道会有多少变数。而且我还需要列名。

是否可以使用数据库/sql?

更新。我找到了如何解决这个问题的一部分。如何从结果集中获取列名。

rows, err := db.Query(sqlcommand)

cols, err := rows.Columns()

所以,我可以用来制作地图的钥匙。但我仍然不知道如何获得价值。因为,值可以有不同的类型。

data = make(map[string]string)

if rows.Next() {
    columns := make([]interface{}, len(cols))
    columnPointers := make([]interface{}, len(cols))
    for i, _ := range columns {
        columnPointers[i] = &columns[i]
    }

    err = rows.Scan(columnPointers...)

    for i, colName := range cols {
        // value is in columns[i] of interface type.
        // How to extract it from here? 
        // ....
        data[colName] = val
    }
}

附:这个问题与“在 mysql 中获取表列名? "。我想获取返回数据集的列,而不仅仅是一个表。

【问题讨论】:

  • @Shadow 不是一个恰当的副本。这个问题专门针对 Go。
  • @Adrian 让我引用这个问题:“是否可以使用 database/sql ?”副本显示如何使用 sql 执行此操作。如果这不是 OP 的意图,那么问题不应该包括 sql,也可能不应该被标记为 MySQL。
  • @Shadow database/sql 是用于与 SQL 数据库交互的 Go 库的名称。我认为没有理由不应该将它标记为 mysql,因为问题是关于在 Go 中使用 MySQL。使用这两个标签似乎完全合适,我认为他们没有理由不应该包含他们从 Go 代码执行的相关查询。仅仅因为问题不是关于 SQL 的,并不意味着它根本与 SQL 无关。
  • Rows.Columns 返回列名,Rows.ColumnTypes 返回类型和名称。没有LIMIT 1,QueryRow 是不合适的;改用查询。
  • 很确定他们正在寻找一种特定于他们使用的标签的所有标签的解决方案。这就是标签的工作原理,这就是为什么您可以在一个问题上放置多个标签。

标签: go


【解决方案1】:

您似乎走在正确的轨道上。根据Rows.Scan 的定义,您可以提供所需目标类型的值,此处为string。因此将columns 的类型更改为[]string 应该可以:

var db sql.DB
var sqlcommand string

rows, _ := db.Query(sqlcommand)
cols, _ := rows.Columns()

data := make(map[string]string)

if rows.Next() {
    columns := make([]string, len(cols))
    columnPointers := make([]interface{}, len(cols))
    for i, _ := range columns {
        columnPointers[i] = &columns[i]
    }

    rows.Scan(columnPointers...)

    for i, colName := range cols {
        data[colName] = columns[i]
    }
}

【讨论】:

  • 是的。这就是我最终所做的。我的解决方案略有不同。我将列转换为字节,如果 len() 大于 0 而不是转换为字符串
  • 这对我也很有效,除非你使用 gorm 包 (github.com/jinzhu/gorm) 并且如果你的 db 对象是 *gorm.DB 类型,那么,替换 db.Query(sqlcommand)上面有db.Raw(sqlcommand).Rows()
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多