我必须通过Go从MS-SQL数据库创建一个JSON。问题是某些数据库字段是在后端系统(而不是 Go(中动态创建的。
可能有:
type Demotable struct{
Id int
Name string
Adress int
Z_somedynamicfield string
Z_anotherfield int
}
所有以"Z_"为前缀的字段都是动态的,因此结构也可以是:
type Demotable struct{
Id int
Name string
Adress int
Z_completedifferent int
Z_notlikefirst string
Z_evenmorefields string
}
我还有一个帮助表,其中描述了每个"动态字段":
| tableName | fieldName | fieldType |
+-----------+--------------------+-----------+
| Demotable | Z_somedynamicfield | string |
+-----------+--------------------+-----------+
| Demotable | Z_anotherfield | int |
...
理想情况下,我会使用帮助表中的信息动态"扩展"结构 - 但我不知道这如何或是否可能?
我会首先通过预准备语句查询表的当前表:
SELECT * FROM [DatabaseName].INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'MyTable'
将查询结果存储在字符串切片中。执行此操作后,创建一个包含string
键和*interface{}
值的映射。
results := make(map[string](*interface{})
在循环访问实际查询的结果时,您最终可以分配上一个查询中的值来映射结果。
Kyle Banks提供了有关从本文的查询结果接收动态结果的精彩解释。
如果出于任何原因您需要实际指定结果的类型,则reflect
包将为您的需要自动解析值类型提供很多帮助。