go-zero中集成gorm框架

1,041 阅读2分钟

前言

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架, 其中的goctl工具可以生成简单的curd代码,但是go-zero默认使用的sqlx库需要自己维护完整的sql语句,我们可以使用gorm库来简化sql的编写,但是原生的gorm库不具备sqlx的链路追踪,指标监控和缓存集成.

gorm-zero库

我发现社区中有人做了一个库源码地址,可以让goctl官方的代码生成工具生成gorm的curd代码.我对该库做了二次开发,集成链路追踪,指标监控,集成logx,还对gorm库做了一些增强.

使用

下载

go get github.com/klen-ygs/gorm-zero

替换模板

goctl template init --home ./template
cd template/model
go run github.com/klen-ygs/gorm-zero/model@latest

建表

创建文件 studentManager.sql

CREATE TABLE `student`(
    `id` INT AUTO_INCREMENT,
    `name` varchar(10) NOT NULL DEFAULT '',
    `age` INT NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
)charset=utf8mb4;

CREATE TABLE `course`(
    `id` INT AUTO_INCREMENT,
    `name` varchar(20) NOT NULL DEFAULT '',
    `credit` INT NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
)charset=utf8mb4;

CREATE TABLE `sc` (
    `id` INT AUTO_INCREMENT,
    `student_id` INT NOT NULL,
    `course_id` INT NOT NULL,
    `grade` INT NOT NULL,
    PRIMARY KEY (`id`)
);

生成代码

goctl model mysql ddl -dir ./internal/model -src studentManager.sql -style go_zero -home template
go mod tidy

生成代码如下

Screenshot_20240102_170703.png

编写查询方法

在生成的代码中,对每张表生成用于指定查询字段的对象,在本例中为,QStudent, QSC, QCourse,下面的实例中会使用到

在student_model.go中编写自己的查询方法,三个方法示例如下

// customStudentLogicModel 在这里编写你的代码
customStudentLogicModel interface {
    WithSession(tx *gorm.DB) StudentModel

    // FindStudentByName 自己的查询方法
    FindStudentByName(ctx context.Context, name string) ([]*Student, error)
    // FindStudentAgeBetween 自己的查询方法
    FindStudentAgeBetween(ctx context.Context, start, end int) ([]*Student, error)
    // FindStudentGradeGreater 自己的查询方法
    FindStudentGradeGreater(ctx context.Context, greater int) (resp []*Student,err error)
}

// FindStudentByName select * from student where name = #{name}
func (c customStudentModel) FindStudentByName(ctx context.Context, name string) (resp []*Student, err error) {
	err = c.conn.
		WithContext(ctx).
		Where(Eq(&QStudent.Name, name)).
		Find(&resp).
		Error

	return
}
	
// FindStudentAgeBetween select * from student where age between #{start} and #{end}
func (c customStudentModel) FindStudentAgeBetween(ctx context.Context, start, end int) (resp []*Student,err error) {
	err = c.conn.
		WithContext(ctx).
		Where(Between(&QStudent.Age, start, end)).
		Find(&resp).
		Error
	
	return 
}

// FindStudentGradeGreater
// select student.* from student as stu
// join sc on stu.id = sc.student_id
// where sc.grade > #{greater}
func (c customStudentModel) FindStudentGradeGreater(ctx context.Context, greater int) (resp []*Student, err error) {
	err = c.conn.
		WithContext(ctx).
		Joins(On(&QSc, &QSc.StudentId, &QStudent.Id)).
		Where(Gt(&QSc.Grade, greater)).
		Find(&resp).
		Error

	return
}

总结

借助goctl代码生成工具,我们可以很方便的得到model代码,然后借助增强的gorm框架,可以增加代码开发效率.