【问题标题】:Is there a way to get the Type for a Column using package database/sql in golang?有没有办法在 golang 中使用包 database/sql 获取列的类型?
【发布时间】:2013-07-25 15:31:24
【问题描述】:

基本上,在事先不知道查询的结果结构可能是什么的情况下,我想查询数据库,并返回这样的结构(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. 制作一个接口数组{} Column() 的大小,
  2. 然后为每一列确定它的类型,
  3. 然后用指向该类型的指针填充数组,
  4. 然后将数组传递给 Scan()

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

【问题讨论】:

标签: sql reflection go


【解决方案1】:

你应该可以这样做:

func printRows(rows *sql.Rows){

    colTypes, err := rows.ColumnTypes()
    for _,s := range colTypes {
      log.Println("cols type:", s.DatabaseTypeName());
    }
}

【讨论】:

  • 我接受了你的回答——这是我自己得出的答案。
【解决方案2】:

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

但您可以使用this code 进行任意查询。并且 json 包中的 json.Marshall() 将使用反射来确定打印值的正确方式,因此您可以拥有这样的结构:

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

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

【讨论】:

  • 什么? cols, err := rows.Columns() 会给我们信息吗?怀疑吗?
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2020-10-04
  • 2011-06-12
相关资源
最近更新 更多