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

时间:2013-07-25 16:00:35

标签: sql reflection go

基本上,如果不事先知道查询的结果可能是什么,我想查询数据库,并返回这样的结构(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中使用package database / sql获取列的类型?

我怀疑我想做的是

  1. 创建一个接口{}数组,其大小为Column(),
  2. 然后为每列确定它的类型,
  3. 然后用指向该类型的指针填充数组
  4. 然后将数组传递给Scan()
  5. 这有点像sqlx中的代码示例,但没有首先知道数据将填充的结构。

2 个答案:

答案 0 :(得分:2)

您应该可以这样做:

func printRows(rows *sql.Rows){

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

答案 1 :(得分:0)

使用database / sql?不(据我所知)。

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

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

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