下一篇: GROM GEN的代码生成
非常感谢同学们的信任和支持。为了更好的服务大家,有了GEN文章合集,详细的介绍GEN的所有配置和用法。有任何疑问欢迎留言。
推荐有时间的同学可以将系列文章都过一遍有个印象、没有时间的同学可以通过关键词搜索找到自己需要的内容。
接下来的我将会分成四篇文章,分别介绍GEN基础、GEN的代码生成以及GEN生成代码后的使用和最佳实践。本文将介绍GEN的基础,包括简介、和简单的demo。
Gorm Gen 是什么?
-
GEN基于GORM实现,是能兼容GORM高效查询架构和开发效率和业务安全性的最新工具,可以帮助RD同学稳定、安全的完成开发工作。
-
真正帮助同学们解决重复编写数据结构和CRUD的痛点,一键映射数据库表像、一键生成查询代码,帮助同学们专注业务逻辑,更高效的完成手头的开发工作。
-
简言之:gen是高效、安全的ORM工具
Gorm Gen 能做什么?
⚡️ 自动同步库表,省去繁琐复制
- 指定数据库中表名后,一键自动映射为对应结构体代码,避免了在看瞎眼的列名和类型中逐个翻译为对应go数据类型的繁琐,轻松快速且稳定的帮开发者建立数据和代码的联系。
🔗 代码一键生成,专注业务逻辑
- 用注释的形式描述查询的逻辑后,一键即可生成对应的安全可靠查询API,帮助开发者免于语法和实现的细节,专注于查询逻辑的设计。
🐞 字段类型安全,过滤参数错误
- 为数字、字符串、布尔类型、时间类型硬编码制定差异化类型安全的表达式方法,将操作类型是否正确的检测前置到开发过程中,避免了在执行查询时才发现类型错误的窘境。
😉 查询优雅返回,免于手动创建
- 查询API返回参数的全面优化,直接返回对应的数据结构,免于提前实例化数据后在注入API的繁琐。
如何快速上手Gorm Gen ?
3.1 创建项目、准备gen基础代码
从🦾 最佳实践,拷贝cmd和generate.sh****到自己的项目,修改cmd中的配置
当然除了上面的比较快的方法,也可以自己导入gen,编写基础代码
go get gorm.io/gen
4.2修改gen 配置,执行generate****脚本生成代码
package main
import (
"context"
"strings"
"github.com/go-gorm/gendemo/mysql"
"gorm.io/gen"
)
// GEN Guideline: https://gorm.io/gen/index.html
// generate code
func main() {
//init db
mysql.Init()
db := mysql.DB(context.Background())
// specify the output directory (default: "./query")
// ### if you want to query without context constrain, set mode gen.WithoutContext ###
g := gen.NewGenerator(gen.Config{
OutPath: "../../biz/dal/query",
Mode: gen.*WithDefaultQuery* | gen.*WithQueryInterface*,
/* Mode: gen.WithoutContext,*/
//if you want the nullable field generation property to be pointer type, set FieldNullable true
/* FieldNullable: true,*/
})
g.WithTableNameStrategy(func(tableName string) (targetTableName string) {
if strings.HasPrefix(tableName, "_") { //忽略下划线开头的表
return ""
}
return tableName
})
// reuse the database connection in Project or create a connection here
// if you want to use GenerateModel/GenerateModelAs, UseDB is necessray or it will panic
g.UseDB(db)
// apply basic crud api on structs or table models which is specified by table name with function
// GenerateModel/GenerateModelAs. And generator will generate table models' code when calling Excute.
// g.ApplyBasic(model.User{}, g.GenerateModel("company"), g.GenerateModelAs("people", "Person", gen.FieldIgnore("address")))
g.ApplyBasic(g.GenerateAllTable()...) //同步数据库所有表
// apply diy interfaces on structs or table models
// g.ApplyInterface(func(method model.Method) {}, model.User{}, g.GenerateModel("company"))
// execute the action of code generation
g.Execute()
}
#执行
sh generate.sh
4.3 使用gen生成的代码开始CRUD相关操作
初始化
func init() {
mysql.Init()
SetDefault(mysql.DB(context.Background()))
}
执行CRUD
package handler
import (
"context"
"fmt"
"github.com/go-gorm/gendemo/biz/dal/model"
"github.com/go-gorm/gendemo/biz/dal/query"
"github.com/go-gorm/gendemo/logs"
)
func GenDemo(ctx context.Context) {
user := query.User
userMode := &model.User{Name: "gen", Extra: "test"}
//创建
err := user.WithContext(ctx).Create(userMode)
if err != nil {
logs.CtxError(ctx, "[GenDemo] Create err=%s", err.Error())
return
}
//更新
_, err = user.WithContext(ctx).Where(user.ID.Eq(userMode.ID)).UpdateSimple(user.Name.Value("gen_update"))
if err != nil {
logs.CtxError(ctx, "[GenDemo] UpdateSimple err=%s", err.Error())
return
}
//查询
users, total, err := user.WithContext(ctx).Where(user.IsDeleted.Eq(0), user.Name.Eq("gen")).FindByPage(0, 10)
if err != nil {
logs.CtxError(ctx, "[GenDemo] FindByPage err=%s", err.Error())
return
}
for _, u := range users {
fmt.Println(u.Name)
}
logs.CtxInfo(ctx, "[GenDemo] Find total=%d", total)
//删除
_, err = user.WithContext(ctx).Where(user.ID.Eq(userMode.ID)).Delete()
if err != nil {
logs.CtxError(ctx, "[GenDemo] Delete err=%s", err.Error())
return
}
}
示例代码: github.com/go-gorm/gen…
下一篇: GROM GEN的代码生成