大型项目经常需要在标准的用户表或员工表加些扩展字段,如果你有一套标准的用户管理系统的话,要么每个项目复制过来改一遍或者添加十几个固定的自定义字段Def1~Def10, 现在可以用在gorm定义模型时使用泛型来解决这个问题
gorm embeded嵌入字段
使用gorm:"embedded"定义嵌入字段
1 2 3 4 5 6 7 8 9 10 11
| type User struct { gorm.Model Username string Password string Extend UserExtendField `gorm:"embedded"` }
type UserExtendField struct { OpenID string UnionID string }
|
上面的model等价于这个, 两个生成的表结构是一致的
1 2 3 4 5 6 7
| type User struct { gorm.Model Username string Password string OpenID string UnionID string }
|
上面两个模型都会生成同样的ddl sql, 如下
1 2 3 4 5 6 7 8 9 10 11 12 13
| create table if not users ( id bigint unsigned auto_increment primary key, created_at datetime(3) null, updated_at datetime(3) null, deleted_at datetime(3) null, username longtext null, password longtext null, org_id longtext null, open_id longtext null, union_id longtext null )
|
使用泛型定义可扩展的模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| type User[ExtendField any] struct { gorm.Model Username string Password string Extend ExtendField `gorm:"embedded"` }
func (User[Extend, Item]) TableName() string { return "ma_users" }
type ExtendUserField struct { OrgID string OpenID string UnionID string }
|
使用方法
1 2 3 4 5 6
| db.AutoMigrate(User[ExtendUserField])
var list []User[ExtendUserField] db.model(&User[ExtendUserField]).Find(&list)
|
可扩展的子表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| type User[ExtendField any,Item any] struct { gorm.Model Username string Password string Extend ExtendField `gorm:"embedded"` Items Item `gorm:"foreignKey:user_id"` }
func (User[Extend, Item]) TableName() string { return "ma_users" }
type UserItem struct { gorm.Model UserID uint Product string }
type ExtendUserField struct { OrgID string OpenID string UnionID string }
|
使用方法
1 2 3
| var list []User[ExtendUserField, UserItem] db.model(&User[ExtendUserField, UserItem]).Find(&list)
|
使用类型别名简化泛型类型
使用类型别名, 可以把上面的泛型代码简化
1 2 3 4
| type MyUser = User[ExUserField, UserItem]
var list []MyUser db.model(&MyUser).Find(&list)
|