如何从 Mysql 填充 Struct 类型映射

Posted

技术标签:

【中文标题】如何从 Mysql 填充 Struct 类型映射【英文标题】:How to fill a Struct type map from Mysql 【发布时间】:2021-12-17 23:21:41 【问题描述】:

我是 Golang 的新手。 这是我要加载的结构,问题是存在我不知道如何从 mysql 填充的 map [string] ChannelST

type StreamST struct 
    Name     string
    Channels map[string]ChannelST


type ChannelST struct 
    Name             string
    URL              string
    OnDemand         bool
    Debug            bool
    Status           int
    runLock          bool
    codecs           []av.CodecData
    sdp              []byte
    signals          chan int
    hlsSegmentBuffer map[int]SegmentOld
    hlsSegmentNumber int
    clients          map[string]ClientST
    ack              time.Time

【问题讨论】:

【参考方案1】:

确切的答案很大程度上取决于您的数据库架构。我将尝试给出一个通用的答案。你可以走两种方式(据我所知):

    使用在这方面对您有很大帮助的库,例如 sqlx 或 gorm。这些库将查看结构和标签中导出的字段以自动填充它们。 使用标准的sql 库,自己做所有事情。在这种情况下,您需要使用 Rows.Scan 函数自己填充结构。

无论如何,您的StreamST 结构包含一个映射,它是一个集合,所以我假设您要连接两个表。在 GORM 中,您可以指定关系,库会考虑到这一点。虽然我不确定这是否也只适用于切片或地图,因为 GORM 不知道将结构的哪个字段用作地图的索引。

在使用标准库时,返回的行与 SQL 查询的结果完全相同,所以左表的字段会重复,因此您需要编写自己的逻辑将这个字段列表转换为结构合理。

最后,您有许多自定义类型,例如 av.CodecData。如果这些对应于单个字段但采用自定义格式,您可以通过让这些结构实现 sql.Scanner 和 driver.Valuer 接口来实现自定义编码/解码。

【讨论】:

感谢您的回答。我有这个,但它是一个列表,我需要它在地图上(?)。我知道它返回一个列表,但我不知道要填写地图 [字符串]ChannelST。 func ListarDispositivos() ListaDispositivos oLista := ListaDispositivos sqlQuery := CALL listarDispositivos(); db.Open() rows, _ := db.Query(sqlQuery) for rows.Next() var oChannel ChannelST rows.Scan(&oChannel.名称, &oChannel.URL, &oChannel.OnDemand, &oChannel.Debug, &oChannel.Status, &oChannel.runLock) oLista = append(oLista, oChannel) db.Close() return oLista 这取决于你的地图的关键。如果您想要一个键等于oChannel.Name 的映射,您可以通过在for rows.Next() 循环(oMap := make(map[string]ChannelST)) 之外声明映射来将切片/列表转换为映射,而不是使用oLista = append(oLista, oChannel) 您设置一个在地图中键入oMap[oChannel.Name] = oChannel 非常感谢您对我的帮助

以上是关于如何从 Mysql 填充 Struct 类型映射的主要内容,如果未能解决你的问题,请参考以下文章

如何根据下拉选择填充强类型文本框

如何从 BigQuery 中的 Array(Struct) 类型数据结构中获取每个键名的值

转到struct类型,填充嵌入式struct字段

强类型数据集无法填充,表映射问题? c#.net 2.0

Python Scrapy - 从 mysql 填充 start_urls

C中的结构访问