4

基本上,在事先不知道查询的结果结构可能是什么的情况下,我想查询数据库,并返回这样的结构(json-y)

// Rows
[
   // Row 1
   [
      { ColumnName: "id", Value: 1, Type: int },
      { ColumnName: "name", Value: "batman", Type: string },
      ...
   ],

   // Row 2
   [
      { ColumnName: "id", Value: 2, Type: int },
      { ColumnName: "name", Value: "superman", Type: string },
      ...
   ]
]

有没有办法在 golang 中使用包 database/sql 获取列的类型?

我怀疑我想做的是

  1. 将 interface{} 数组设为 Column() 的大小,
  2. 然后为每一列确定它的类型,
  3. 然后用指向该类型的指针填充数组,
  4. 然后将数组传递给 Scan()

这有点像sqlx中的这个代码示例,但首先不知道数据将填充的 Struct。

4

2 回答 2

5

你应该可以这样做:

func printRows(rows *sql.Rows){

    colTypes, err := rows.ColumnTypes()
    for _,s := range colTypes {
      log.Println("cols type:", s.DatabaseTypeName());
    }
}
于 2020-02-24T05:20:44.897 回答
0

使用数据库/sql?没有(据我所知)。

但是您可以将此代码用于任意查询。并且json.Marshall()从 json 包中将使用反射来确定打印值的正确方法,因此您可以具有如下结构:

type Column struct {
    ColumnName  string
    ColumnValue interface{}
    ColumnType  string
}

然后用于reflect.TypeOf(someVariable).String()获取 ColumnType 的类型。

于 2014-06-03T14:50:19.523 回答