从sphinx db到有点复杂的golang结构的最佳实践

时间:2017-04-07 18:29:18

标签: mysql json go sphinx sqlx

我正在尝试通过MySQL将sphinx查询转换为golang结构并且很难。看起来这应该是一个常见的问题,但到目前为止,我仍然无法将其转换为地图或解析输出。具体来说,我在sphinx中有一个模式,看起来像{来源:{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
}

并将Status结构传递给Row.ScanStruct()并返回“Missing destination Name Source”错误或者如果我在Status中命名源成员,我得到“sql:列索引0上的扫描错误:不支持扫描,存储driver.Value类型[] uint8到类型* v1.Source“。完全披露,sphinx架构还有一些其他列作为StatusByCampaign的同伴,他们跟在它之后,我不关心它们在我的用例中。

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

2 个答案:

答案 0 :(得分:1)

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

所以看起来我要在Go中重写该库,或者更有可能将索引算法更改为使用JSON。

答案 1 :(得分: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")其中&people是对结构的引用。 E.g var people PeopleStruct

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