Gorm 指定表前缀或指定表名

作者: adm 分类: go 发布时间: 2021-09-30

学习go,那就绕不过建立模型结构体,但是我之前的表都是带前缀的,没办法,这边肯定也要加上。一顿操作,就把我的成果介绍下吧,这里了解了两种操作方式:

指定表前缀

dberr = gorm.Open("mysql", dsn) if err != nil {
    log.Fatalf("Open mysql failed. %v\n"err)
}
db.DB().SetConnMaxLifetime(100 * time.Second)  //最大连接周期,超过时间的连接就close 
db.DB().SetMaxOpenConns(100)   //设置最大连接数 
db.DB().SetMaxIdleConns(0)    //设置闲置连接数 
db.SingularTable(true)   //设置全局表名禁用复数 
//指定表前缀,修改默认表名 
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {    
    return "prefix_" + defaultTableName 
}

统一的表前缀最简单的方法就是在数据库初始化的时候,修改默认表名,把前缀带上。比如“it_article”表,结构体则是 type Article struct {}。如果不修改默认表名的话,结构体名称要加上前缀,变成 type ItArticle struct {},要不然找不到表。

指定表名

type Article struct {
    Id         uint32 `json:"id"`    
    Title      string `json:"title"`    
    Content    string `json:"content"` 
} 
func (Article) TableName() string {
    //实现TableName接口,以达到结构体和表对应,如果不实现该接口,并未设置全局表名禁用复数,gorm会自动扩展表名为articles(结构体+s)
    return "it_article" 
}

模型中指定表名可以随便映射结构体,通过TableName返回表全名即可。


注意:以上是1.x版本的操作,8月底已发布v2版本了。

指定表前缀和单数表名 – v2

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  NamingStrategy: schema.NamingStrategy{
    TablePrefix: "it_",   // 表名前缀,`Article` 的表名应该是 `it_articles`
    SingularTable: true, // 使用单数表名,启用该选项,此时,`Article` 的表名应该是 `it_article`
  },
})

如果单纯指定前缀和表单数形式,我们在数据库连接时直接配置就好了,和v1思路相同,就是写法区别。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!