繁体   English   中英

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

[英]Best Practice to go from sphinx db to somewhat complex golang struct

我正在尝试通过MySQL将狮身人面像查询转换为golang结构,并且遇到了麻烦。 看来这应该是一种常见的问题,但到目前为止,我仍然坚持自己将其转换为地图或解析输出。 具体来说,我在狮身人面像中有一个架构,看起来像{来源:{ID:string,subId:string,Campaigns:[] {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上的扫描错误:不支持的扫描,将driver.Value类型[] uint8存储为* v1.Source类型。 完全公开之后,与StatusByCampaign的同位体一样,狮身人面像架构还有其他几列,它们紧随其后,在我的用例中我不在乎它们。

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

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

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

我认为这可能是您定义结构的方式。 给定您提供的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是对结构的引用。 例如var people PeopleStruct

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM