GORM 按结构体建指定名字的表

最近在开发 QQ 机器人和它的管理面板,数据库用 GORM。

大学习的完成情况是按群记的,我的设计是每个群一张表,表名就是群号。表的结构都一样:QQ 号、名字、完成状态、截图地址。

GORM 平时建表用 AutoMigrate(&user{}),表名由结构体名推出来,user 会建成 users。一个结构体只对应一张表,没办法用同一个结构体建出一堆名字不同的表。

db.Table(name) 可以在这一次操作里临时指定表名,后面接 Migrator().CreateTable() 就按指定的名字建表,结构还是从结构体来。

// 结构体
type user struct {
	QQ   int64  `json:"qq"`
	Name string `json:"name"`
	Comp int    `json:"comptype"`
	Url  string `json:"url,omitempty"`
}

// gorm 新建一个user结构的表
// database 为 *gorm.DB 类型
func createTable(groupId string) error {
	err := database.Table(groupId).Migrator().CreateTable(&user{})
	return err
}

机器人加进一个新群时调用 createTable(群号),这个群就有自己的表了。Table() 只对这一条链式调用生效,不改全局,所以之后对这个群的查询和写入也都要带上 database.Table(groupId),不带的话 GORM 又会去找 users 表。

头图/Cover

Photo by Simeon Maryska on Pexels

评论

评论加载中…

输入关键词开始搜索。

选择Enter 打开Esc 关闭CtrlK 唤起