基本上,在不知道查询的结果结构的情况下,我想查询数据库,并返回这样的结构(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中使用包数据库/sql获取列的类型?
我怀疑我想做的是
- 使接口{}的数组大小为Column()
- 则对于每一列确定其类型
- 然后用指向该类型的指针填充数组
- 然后将数组传递给Scan()
这有点像sqlx中的这个代码示例,但不首先知道数据将被填充的Struct。
您应该可以这样做:
func printRows(rows *sql.Rows){
colTypes, err := rows.ColumnTypes()
for _,s := range colTypes {
log.Println("cols type:", s.DatabaseTypeName());
}
}
使用数据库/sql?没有(据我所知)。
但是您可以将此代码用于任意查询。json包中的json.Marshall()
将使用反射来确定打印值的正确方式,因此您可以有这样的结构:
type Column struct {
ColumnName string
ColumnValue interface{}
ColumnType string
}
然后使用reflect.TypeOf(someVariable).String()
获取ColumnType的类型。