likes
comments
collection
share

GORM GEN 快速开始

作者站长头像
站长
· 阅读数 17

非常感谢同学们的信任和支持。为了更好的服务大家,有了GEN文章合集,详细的介绍GEN的所有配置和用法。有任何疑问欢迎留言。

推荐有时间的同学可以将系列文章都过一遍有个印象、没有时间的同学可以通过关键词搜索找到自己需要的内容。

GORM 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…