前言
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
生成代码如下
编写查询方法
在生成的代码中,对每张表生成用于指定查询字段的对象,在本例中为,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框架,可以增加代码开发效率.