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

相关推荐
超级大只老咪几秒前
固定个数的状态,需要按顺序无限循环切换
数据库
@insist12319 分钟前
数据库系统工程师-云计算与大数据核心知识
大数据·数据库·云计算·软考·数据库系统工程师·软件水平考试
皙然22 分钟前
深度解析:关系型数据库与非关系型数据库(区别+原理+适用场景,一文吃透)
数据库·nosql
我的xiaodoujiao43 分钟前
API 接口自动化测试详细图文教程学习系列7--相关Python基础知识6
python·学习·测试工具·pytest
山川行1 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio
charlie1145141911 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(2) —— HAL 库获取、启动文件坑位与目录搭建
linux·开发语言·c++·stm32·单片机·学习·嵌入式
夕除1 小时前
Mysql
数据库·mysql
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-03-28
数据库·人工智能·经验分享·神经网络·chatgpt
知识分享小能手1 小时前
MongoDB入门学习教程,从入门到精通,MongoDB聚合框架(7)
数据库·学习·mongodb
城数派1 小时前
2015-2024年我国1km分辨率逐日地表温度(LST)栅格数据
数据库·arcgis·信息可视化·数据分析·excel