go-kratos 学习笔记(9) 数据库gorm生成所有数据表模型gen

GEN 指南

GEN: 更友好 & 更安全 GORM 代码生成。

通过接口上添加注释的方式,Gen 允许从 Raw SQL 生成完全安全的通用 Go 代码, 这些接口可以在代码生成过程中应用于多个model。

不仅支持完整的 SQL,也支持SQL 代码片段生成使用

安装
复制代码
go get -u gorm.io/gen

生成一个 app/users/data/gen/generatedal.go

复制代码
//go:generate go run generatedal.go

package main

import (
	"fmt"
	"github.com/iancoleman/strcase"
	"gopkg.in/yaml.v2"
	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
	"os"
	"strings"
)

// 定义一个配置的结构体 和Data结构体一样
type Config struct {
	Data struct {
		Database struct {
			Driver string `yaml:"driver"`
			Source string `yaml:"source"`
		} `yaml:"database"`
	} `yaml:"data"`
}

// 自定义查询的接口
type Querier interface {
	//select * from users u iner join orders o on u.id = o.user_id where u.id = ? and u.name = ?
	GetOrdersByUserIDAndName(userID int, name string) ([]*gen.T, error)
}

func main() {
	g := gen.NewGenerator(gen.Config{
		OutPath:      "../dal/query",
		Mode:         gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode
		ModelPkgPath: "../dal/entity",
	})

	// 获取配置文件
	config, err := loadConfig()
	if err != nil {
		panic(err)
	}
	gormdb, _ := gorm.Open(mysql.Open(config.Data.Database.Source), &gorm.Config{})
	g.UseDB(gormdb) // reuse your gorm db

	var tables = []string{"users", "students"}
	tableModels := make([]interface{}, len(tables))
	 Generate basic type-safe DAO API for struct `model.User` following conventions
	//给生成的模型都加上Mo后缀
	g.WithModelNameStrategy(func(tableName string) (modelName string) {
		//modelName后面加上Mo
		modelName = strcase.ToCamel(tableName) + "Mo"
		return modelName
	})
	//表都加上t_前缀
	g.WithTableNameStrategy(func(tableName string) (targetTableName string) {
		return "t_" + tableName
	})
	g.WithFileNameStrategy(func(tableName string) (fileName string) {
		return strings.TrimLeft(tableName, "t_")

	})
	//数据类型转换
	var dataMap = map[string]func(gorm.ColumnType) (dataType string){
		// int mapping
		"int": func(columnType gorm.ColumnType) (dataType string) {
			if n, ok := columnType.Nullable(); ok && n {
				return "*int32"
			}
			return "int32"
		},

		// bool mapping
		"tinyint": func(columnType gorm.ColumnType) (dataType string) {
			ct, _ := columnType.ColumnType()
			if strings.HasPrefix(ct, "tinyint(1)") {
				return "bool"
			}
			return "byte"
		},
		"timestamp": func(columnType gorm.ColumnType) (dataType string) {
			return "time.Time"
		},
	}
	g.WithDataTypeMap(dataMap)
	for i, table := range tables {
		tableModels[i] = g.GenerateModel(table)
	}
	//生成所有的数据表的结构体
	g.ApplyBasic(
		// Generate structs from all tables of current database
		tableModels...,
	)
	//复杂的查询生成器 注解 根据SQL生成方法
	g.ApplyInterface(func(Querier) {
	}, g.GenerateModel("users"))

	// Generate the code
	g.Execute()
}

func loadConfig() (Config, error) {
	file, err := os.Open("../../../configs/config.yaml")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	var config Config
	err = yaml.NewDecoder(file).Decode(&config)
	if err != nil {
		panic(err)
	}
	fmt.Println(config)
	return config, nil
}

文件头部加入 //go:generate go run generatedal.go 可以让执行 go generate ./...的时候自动生成代码

复制代码
#根目录执行

go generate ./...

#或者在gen目录下执行

go run generatedal.go

生成的代码如下

代码中使用UserMo要把包名换一下 entity.UsersMo

项目的代码 码云 https://gitee.com/gebilaoxie/xgs_kratos.git

相关推荐
zhangrelay10 分钟前
如何使用AI快速编程实现标注ROS2中sensor_msgs/msg/Image图像色彩webots2025a
人工智能·笔记·opencv·学习·计算机视觉·机器人视觉
一 乐20 分钟前
个人理财系统|基于java+小程序+APP的个人理财系统设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·后端·小程序
m0_7482480224 分钟前
Redis的数据淘汰策略解读
数据库·redis·缓存
哥哥还在IT中36 分钟前
让数据库更智能-大模型如何优化我们的SQL查询
数据库·sql
计算机小手37 分钟前
探索 Maxwell:高效捕获 MySQL 数据变更的轻量级中间件
数据库·经验分享·mysql·开源软件
universe_011 小时前
前端学习css
前端·css·学习
IvorySQL1 小时前
使用 PostgreSQL 时间点恢复(Point-In-Time Recovery)的多种数据恢复技术
数据库·postgresql
海边夕阳20061 小时前
【每天一个AI小知识】:什么是自监督学习?
人工智能·经验分享·学习
腾讯云云开发1 小时前
小程序数据库权限管理,一看就会!——CloudBase新手指南
前端·数据库·微信小程序
weixin_514221852 小时前
FDTD代码学习-1
学习·算法·lumerical·fdtd