惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
D
Docker
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
H
Help Net Security
B
Blog
宝玉的分享
宝玉的分享

东方星痕

忆时塔 OOM 追凶记 仓颉服务 - 忆时塔 OOM 追凶记 戴森球与光伏文明:一个被忽略的最优解 戴森球与光伏文明:一个被忽略的最优解 | 东方星痕 鸿蒙PC上使用box64运行x86_64鸿蒙SDK编译HAP 鸿蒙PC上使用box64运行x86_64鸿蒙SDK编译HAP | 东方星痕 仓颉语言 Neovim 开发环境配置指南 仓颉语言 Neovim 开发环境配置指南 | 东方星痕 鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南 鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南 | 东方星痕 鸿蒙PC融合开发引擎架构解析:虚拟机与容器双模式 鸿蒙PC融合开发引擎架构解析:虚拟机与容器双模式 | 东方星痕 MCP-Term:一个未出生即夭折的想法 MCP-Term:一个未出生即夭折的想法 | 东方星痕 鸿蒙PC Matebook Pro上全局安装GIT 鸿蒙PC Matebook Pro上全局安装GIT | 东方星痕 Neovim移植鸿蒙PC:三方库适配实战与挑战解析 Neovim移植鸿蒙PC:三方库适配实战与挑战解析 | 东方星痕 鸿蒙PC Matebook Pro上安装仓颉编译器每日构建版 鸿蒙PC Matebook Pro上安装仓颉编译器每日构建版 | 东方星痕 鸿蒙pc上Vite 7 + Rollup原生模块问题的解决方案 鸿蒙pc上Vite 7 + Rollup原生模块问题的解决方案 | 东方星痕 hypyland实现alt + tab切换到任意工作区的窗口 hypyland实现alt + tab切换到任意工作区的窗口 | 东方星痕 使用泛型设计gorm扩展字段 使用qemu8.0安装龙芯loongarch64版本archlinux 使用qemu8.0安装龙芯loongarch64版本archlinux | 东方星痕 在archlinux aur上提交龙芯loongarch的软件包 在archlinux aur上提交龙芯loongarch的软件包 | 东方星痕 k3s云上master+内网agent的部署方式
使用泛型设计gorm扩展字段 | 东方星痕
2023-09-25 · via 东方星痕

使用泛型设计gorm扩展字段

大型项目经常需要在标准的用户表或员工表加些扩展字段,如果你有一套标准的用户管理系统的话,要么每个项目复制过来改一遍或者添加十几个固定的自定义字段Def1~Def10, 现在可以用在gorm定义模型时使用泛型来解决这个问题

gorm embeded嵌入字段

使用gorm:"embedded"定义嵌入字段

type User struct {
	gorm.Model
	Username string
	Password string
	Extend   UserExtendField `gorm:"embedded"` // 添加embed tag
}

type UserExtendField struct {
	OpenID string
	UnionID string
}

上面的model等价于这个, 两个生成的表结构是一致的

type User struct {
	gorm.Model
	Username string
	Password string
	OpenID string
	UnionID string
}

上面两个模型都会生成同样的ddl sql, 如下

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   
)

使用泛型定义可扩展的模型

type User[ExtendField any] struct {
	gorm.Model
	Username string
	Password string
	Extend   ExtendField `gorm:"embedded"`
}

// 需要自定义表名,否则gorm识别到的泛型的表名是不符合数据库标准的,建表会错误
func (User[Extend, Item]) TableName() string {
	return "ma_users"
}

// 定义扩展字段结构
type ExtendUserField struct {
	OrgID   string
	OpenID  string
	UnionID string
}

使用方法

// 生成数据库表结构
db.AutoMigrate(User[ExtendUserField])

// 查找
var list []User[ExtendUserField]
db.model(&User[ExtendUserField]).Find(&list)

可扩展的子表

type User[ExtendField any,Item any] struct {
	gorm.Model
	Username string
	Password string
	Extend   ExtendField `gorm:"embedded"`
	Items    Item `gorm:"foreignKey:user_id"` // 这里需要写外键
}
// 需要自定义表名,否则gorm识别到的泛型的表名是不符合数据库标准的,建表会错误
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
}

使用方法

// 查找
var list []User[ExtendUserField, UserItem]
db.model(&User[ExtendUserField, UserItem]).Find(&list)

使用类型别名简化泛型类型

使用类型别名, 可以把上面的泛型代码简化

type MyUser = User[ExUserField, UserItem]

var list []MyUser
db.model(&MyUser).Find(&list)