Gorm 指定表前缀或指定表名
学习go,那就绕不过建立模型结构体,但是我之前的表都是带前缀的,没办法,这边肯定也要加上。一顿操作,就把我的成果介绍下吧,这里了解了两种操作方式:
| 指定表前缀
db, err = 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思路相同,就是写法区别。