使用kitex与gorm开发微服务-2 | 青训营笔记

307 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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代码。

image.png

这里我在dal下创建initdb.go,里面实现了一个数据库的初始化函数。

image.png

在main中进行使用这个函数来初始化。

image.png

下一篇,我们会着重介绍kitex代码的生成。

(ps. 不好意思分成了很多篇短文,都是任务=,=,没办法)

reference:

GORM、Gen 实践 | 青训营笔记 - 掘金 (juejin.cn) mysql package - gorm.io/driver/mysql - Go Packages