0

我正在尝试通过 MySQL 将 sphinx 查询转换为 golang 结构,并且遇到了困难。看起来这应该是一种常见的问题,但到目前为止,我一直坚持将其转换为地图或自己解析输出。具体来说,我在 sphinx 中有一个类似于 {Source: {ID:string, subId:string, Campaigns:[]{CampaignID:string, Status:string}}} 的模式

我试过使用简单的 rows.scan 但这并不能帮助我解析重复字段,我只是将它作为未解析的字符串获取。在 sphinx 中,键不在引号中,因此 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 上的扫描错误:不支持的扫描,将 driver.Value 类型 []uint8 存储到类型 *v1.Source" 中。完全披露,狮身人面像模式有一些其他列作为 StatusByCampaign 的对等列,它们紧随其后,在我的用例中我不关心它们。

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

4

2 回答 2

1

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

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

于 2017-04-13T18:04:53.290 回答
0

我认为这可能是您定义结构的方式。鉴于您提供的 json,{Source: {ID:string, subId:string, Campaigns:[]{CampaignID:string, Status:string}}}您的结构应该类似于下面的内容。

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")Where&people是对结构的引用。例如var people PeopleStruct

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

于 2017-04-08T02:46:33.067 回答