举一个🌰。假如我们需要实现产品售卖规格列表,其中包含可选择的分片数量、分片容量以及副本数量,如下图(非现网代码,仅供示例学习):
我们的表设计如下:
CREATE TABLE `sell_spec` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `product` varchar(45) NOT NULL COMMENT '产品名称', `resources` json NOT NULL COMMENT '资源规格(cpu:memory),例如:["0:0.25", "0:1", "1:2"]', `disk_min` int(10) DEFAULT NULL COMMENT '磁盘最小容量', `disk_max` int(10) DEFAULT NULL COMMENT '磁盘最大容量', `disk_step` int(10) DEFAULT NULL COMMENT '磁盘递增大小', `shards` json NOT NULL COMMENT '分片规格,例如:[1,3,5,8,12,16,24,32,40,48,64,80,96,128]', `replicas` json NOT NULL COMMENT '副本规格,例如:[1,2,3,4,5,6,7,8,9,12]', `created_at` datetime DEFAULT NULL COMMENT '创建时间', `updated_at` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='售卖规格配置';
其中的resources, shards, replicas
我们定义为json
格式,目的是可以存储自定义的资源、分片、副本规格列表(非顺序性)。那么我们的go struct
定义如下:
// SellSpec 是通过GoFrame工具自动生成的数据结构,由工具维护。 type SellSpec struct { Id uint `description:"主键"` Product string `description:"产品名称"` Resources string `description:"资源规格(cpu:memory),例如:[\"0:0.25\", \"0:1\", \"1:2\"]"` DiskMin int `description:"磁盘最小容量"` DiskMax int `description:"磁盘最大容量"` DiskStep int `description:"磁盘递增大小"` Shards string `description:"分片规格,例如:[1,3,5,8,12,16,24,32,40,48,64,80,96,128]"` Replicas string `description:"副本规格,例如:[1,2,3,4,5,6,7,8,9,12]"` CreatedAt *gtime.Time `description:"创建时间"` UpdatedAt *gtime.Time `description:"更新时间"` } // SellSpecItem 是扩展entity的自定义数据结构, // 其中部分字段Resources/Shards/Replicas被覆盖为了数组类型,方便ORM操作时自动进行类型转换。 type SellSpecItem struct { entity.SellSpec Resources []string `dc:"资源规格"` Shards []int `dc:"分片规格"` Replicas []int `dc:"副本规格"` }
那么在程序中我们可以这么来写入和查询数据记录。
数据写入:
_, err = dao.SellSpec.Ctx(ctx).Data(v1.SellSpecItem{ SellSpec: entity.SellSpec{ Product: "redis", DiskMin: 50, DiskMax: 1000, DiskStep: 10, }, Resources: []string{"1:2", "2:4", "4:8"}, Shards: []int{1, 3, 5, 8, 12, 16, 24, 32, 40, 48, 64, 80, 96, 128}, Replicas: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 12}, }).Insert()
数据查询,ORM
组件将会自动地将数据表中的记录转换为go struct
对应的数组类型属性:
var items []v1.SellSpecItem err = dao.SellSpec.Ctx(ctx).Scan(&items)
10 Comments
leavky
用postgresql试了一下这个,导致错误了,
leavky
按照设置方法,实际生成的数据库执行语句不对,
leavky
郭强 请问这个功能只有mysql有吗,或者有没有gorm类似的生命周期功能,可以自己设置
leavky
data 和 tags 是json类型
wln32
你的结构体到底是什么样子的啊,上面和下面都不一样
leavky
这是数据库的字段:
这是是根据数据库自动生成的:
这个是自定义的:
这个是插入数据失败的:
虽然用给自定义结构体加了一个转化方法解决了,但框架能不能支持一下呢
wln32
你这是什么版本的啊,我这没加什么转换方法就可以插入啊,另外github上有个issue#3560是不是你提的,可以在github上反馈
leavky
2.7的
v2.7.0
Welcome to GoFrame!
Env Detail:
Go Version: go1.21.5 windows/amd64
GF Version(go.mod):
github.com/gogf/gf@v1.16.9
github.com/gogf/gf/contrib/drivers/pgsql/v2@v2.7.0
github.com/gogf/gf/v2@v2.7.0
CLI Detail:
Installed At: C:\Users\go\bin\gf.exe
Built Go Version: go1.21.5
Built GF Version: v2.7.0
Others Detail:
Docs: https://goframe.org
Now : 2024-05-19T16:25:13+08:00
leavky
github上的个issue#356,那个不是我提的
leavky
2.7 以及 2.7.1 生成的文件有问题,在github 上写了,这里也写下帮助碰到相同问题的哥们。可以参考解决办法:https://github.com/gogf/gf/issues/3560#issuecomment-2133443547