这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
本篇我们介绍如何使用gorm-gen生成代码
数据表设计
我们要创建的是用户服务,用户表需要存储用户的用户名,email,加密后的密码,以及基础社交需要的信息:关注数,被关注数等信息。我们做如下设计: (我们的model文件保存在dal/model下面)
type User struct {
gorm.Model // 自动创建id, created_at, updated_at, deleted_at(用于软删除 Unscoped:https://www.cnblogs.com/guodd/p/14934448.html)
Name string `gorm:"type:varchar(128);not null;uniqueIndex"` // Name加唯一索引,用户名不可重复
Password string `gorm:"type:varchar(128);not null"` // md5 128
Email string `gorm:"type:varchar(256)"` // max valid email 254
Follow_count int64
Follower_count int64
}
// 注意字段均需首字母大写
gorm中DB对象提供db.AutoMigrate方法来进行数据表的自动迁移,保持表最新。(注意一旦已经创建过列,即使未使用也不会删除)【参考gorm.io/zh_CN/docs/migration.html 】
迁移的go代码如下:
package main
import (
"log"
"github.com/ClubWeGo/usermicro/dal/model"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func InitUser(db *gorm.DB) {
err := db.AutoMigrate(&model.User{})
if err != nil {
log.Fatal(err)
}
}
func main() {
var datetimePrecision = 2
dsn := "tk:123456@tcp(127.0.0.1:3306)/simpletk?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: dsn, // data source name, refer https://github.com/go-sql-driver/mysql#dsn-data-source-name
DefaultStringSize: 256, // add default size for string fields, by default, will use db type `longtext` for fields without size, not a primary key, no index defined and don't have default values
DisableDatetimePrecision: true, // disable datetime precision support, which not supported before MySQL 5.6
DefaultDatetimePrecision: &datetimePrecision, // default datetime precision
DontSupportRenameIndex: true, // drop & create index when rename index, rename index not supported before MySQL 5.7, MariaDB
DontSupportRenameColumn: true, // use change when rename column, rename rename not supported before MySQL 8, MariaDB
SkipInitializeWithVersion: false, // smart configure based on used version
}), &gorm.Config{})
if err != nil {
log.Fatal(err)
return
}
InitUser(db)
}
生成DAO层
gorm-gen提供了自动生成安全可靠的接口代码的能力。接下来,我们使用gorm-gen来快速生成query代码。 【参考:gorm.io/gen/ GORM 强大的代码生成工具 —— gorm/gen - 掘金 (juejin.cn)】 本文件在cmd/gormGen/gen.go。
package main
import (
"log"
"github.com/ClubWeGo/usermicro/dal/model"
"gorm.io/driver/mysql"
"gorm.io/gen"
"gorm.io/gorm"
)
func main() {
g := gen.NewGenerator(gen.Config{
OutPath: "../../dal/query", // 这里由于此文件在cmd/gormGen里面
Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface,
})
dsn := "tk:123456@tcp(127.0.0.1:3306)/simpletk?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
log.Fatal(err)
return
}
g.UseDB(db)
g.ApplyBasic(model.User{})
// g.ApplyInterface(func(model.UserMethod) {}, model.User{})
g.Execute()
}
运行go run gen.go
这样就在dal/下生成了query文件夹,里面存放的是自动生成的query代码。
这里我在dal下创建initdb.go,里面实现了一个数据库的初始化函数。
在main中进行使用这个函数来初始化。
下一篇,我们会着重介绍kitex代码的生成。
(ps. 不好意思分成了很多篇短文,都是任务=,=,没办法)
reference:
GORM、Gen 实践 | 青训营笔记 - 掘金 (juejin.cn) mysql package - gorm.io/driver/mysql - Go Packages