GORM Gen基于 GORM 的安全 ORM

联合创作 · 2023-09-30 01:31

GORM Gen 是基于 GORM 的更安全的 ORM ,对开发人员更友好。

概述

  • CRUD 或 DIY 查询方法代码生成
  • 自动从数据库迁移到代码
  • 事务、嵌套事务、保存点、回滚到保存点
  • 与 GORM 完全兼容
  • 对开发人员友好
  • 拥有多种生成模式

安装

安装 Gen 包先要安装 Go ,并设置 Go 工作区。

1.首先需要安装 Go( 版本 1.14+),然后使用下面的 Go 命令安装 Gen 。

go get -u gorm.io/gen

然后在代码中导入

import "gorm.io/gen"

快速开始

注意:本文档中的所有用例都是在 WithContext  模式下生成的。如果你在 WithContext   模式下生成代码,请在调用任何查询方法之前删除  WithContext(ctx),可以使代码更加简洁。

# assume the following code in generate.go file
$ cat generate.go
package main

import "gorm.io/gen"

// generate code
func main() {
    // specify the output directory (default: "./query")
    // ### if you want to query without context constrain, set mode gen.WithoutContext ###
    g := gen.NewGenerator(gen.Config{
        OutPath: "../dal/query",
        /* Mode: gen.WithoutContext|gen.WithDefaultQuery*/
        //if you want the nullable field generation property to be pointer type, set FieldNullable true
        /* FieldNullable: true,*/
        //if you want to generate index tags from database, set FieldWithIndexTag true
        /* FieldWithIndexTag: true,*/
        //if you want to generate type tags from database, set FieldWithTypeTag true
        /* FieldWithTypeTag: true,*/
        //if you need unit tests for query code, set WithUnitTest true
        /* WithUnitTest: true, */
    })
  
    // 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
    // db, _ := gorm.Open(mysql.Open("root:@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"))
    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")))
    
    // 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()
}

生成模式:

  • gen.WithoutContext 生成无 WithContext 约束的代码
  • gen.WithDefaultQuery  生成带有默认全局变量 Q 的单例代码

项目目录

以下是最佳实践模板:

demo
├── cmd
│   └── generate
│       └── generate.go # execute it will generate codes
├── dal
│   ├── dal.go # create connections with database server here
│   ├── model
│   │   ├── method.go # DIY method interfaces
│   │   └── model.go  # store struct which corresponding to the database table
│   └── query  # generated code's directory
|       ├── user.gen.go # generated code for user
│       └── gen.go # generated code
├── biz
│   └── query.go # call function in dal/gorm_generated.go and query databases
├── config
│   └── config.go # DSN for database server
├── generate.sh # a shell to execute cmd/generate
├── go.mod
├── go.sum
└── main.go

API 示例

// 生成一个模型结构映射到数据库 g.GenerateModel("people") // 生成一个结构体并指定结构体的名称。 g.GenerateModelAs("people", "People") // 添加忽略字段的选项 g.GenerateModel("people", gen.FieldIgnore("address"), gen.FieldType("id", "int64"))

字段生成选项

FieldNew  // 创建新字段 FieldIgnore  // 忽略字段 FieldIgnoreReg  // 忽略字段(匹配正则表达式) FieldRename  // 重命名结构体中的字段 FieldType  // 指定字段类型 FieldTypeReg  // 指定字段类型(匹配正则表达式) FieldTag  // 指定 gorm和 json 标签 FieldJSONTag  // 指定 json 标签 FieldGORMTag  // 指定 gorm 标签 FieldNewTag  // 附加新标签 FieldTrimPrefix  // 修剪列前缀 FieldTrimSuffix  // 修剪列后缀 FieldAddPrefix  // 添加前缀到结构成员的名称 FieldAddSuffix // 为结构成员的名称添加后缀 FieldRelate  // 指定与其他表的关系 FieldRelateModel // 指定与现有型的关系
浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报