从狮身人面像数据库到有点复杂的 golang 结构的最佳实践



我正在尝试通过MySQL将狮身人面像查询转换为golang结构,但遇到了困难。似乎这应该是一个常见的问题,但到目前为止,我仍然坚持将其转换为地图或自己解析输出。 具体来说,我在狮身人面像中有一个看起来像{来源:{ID:string,subId:string,Campaign:[]{CampaignID:string,Status:string}}}

我尝试使用简单的rows.scan,但这并不能帮助我解析重复字段,我只是将其作为未解析的字符串获取。 在狮身人面像中,键不在引号中,所以 JSON.unmarshal 似乎根本没有帮助。 使用 sqlx,我尝试构建以下结构

type CampaignStatus struct {
CampaignId string
Status string
}
type Source struct {
Id               string
SubId    string
StatusByCampaign []CampaignStatus
}
type Status struct {
Source
}

并将状态结构传递给 Row.ScanStruct(),我得到"缺少目标名称源"错误,或者如果我在状态中命名源成员,我得到"sql:列索引 0 上的扫描错误:不支持扫描,存储驱动程序。将类型 []uint8 转换为类型 *v1。来源"。 完全披露,狮身人面像模式还有其他一些列作为 StatusByCampaign 的对等列,它们紧随其后,在我的用例中我不关心它们。

这似乎是以前必须遇到过的事情,但是除了编写自己的解析器之外,我似乎找不到解决方案,我不愿意这样做。

我发现我正在使用的遗留系统正在使用一个名为ServiceStack的 ASP.Net 库来序列化/反序列化我的狮身人面像数据库,并且它使用自己的自定义JSV格式,ServiceStack的作者说它是JSON和CSV的优化组合,但据我所知,尚未在其他任何地方采用。

所以看起来我要么用 Go 重写该库,要么更有可能更改索引算法以使用 JSON。

我认为这可能是您定义结构的方式。鉴于您{Source: {ID:string, subId:string, Campaigns:[]{CampaignID:string, Status:string}}}提供的 json,您的结构应该看起来像下面的东西。

type object struct {
Source struct {
ID        string     `db:"id"`
SubId     string     `db:"sub_id"`
Campaigns []compaign `db:"compaigns"`
} `json:"source"`
}
type compaign struct {
CampaignID string `db:"compaign_id"`
Status     string `db:"status"`
}

鉴于以下评论。 尝试obj := make(map[string]interaface{})而不是定义结构。

还查看结构 https://github.com/jmoiron/sqlx 应该使用 db 标志而不是 json,所以我更改了它。您不必封送数据

示例db.Select(&people, "SELECT * FROM person ORDER BY first_name ASC")其中&people是对结构的引用。例如var people PeopleStruct

现在我对你的驱动程序不是famailar,但它应该是相同的,因为你通过查询传递对结构或接口的引用,它将数据查找到该引用中。 查询后,通常不必在结构中取消编组。

最新更新