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

相关推荐
love_and_hope4 分钟前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen7 分钟前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)16 分钟前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
有梦想的咸鱼_27 分钟前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
MonkeyKing_sunyuhua37 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青38 分钟前
数据库交互的本地项目:后台管理系统
数据库·交互
马剑威(威哥爱编程)43 分钟前
MongoDB面试专题33道解析
数据库·mongodb·面试
hong1616881 小时前
跨模态对齐与跨领域学习
学习
小光学长1 小时前
基于vue框架的的流浪宠物救助系统25128(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库·vue.js·宠物
阿伟来咯~2 小时前
记录学习react的一些内容
javascript·学习·react.js