【Golang】GORM - GEN工具 快速开始

文章目录

官方地址:https://gorm.io/zh_CN/gen/index.html

以mysql为例

建项目

go 复制代码
go mod init 项目名称
go mod tidy

建库建表

建数据库demo,正常排序和字符集utf8mb4即可

在数据库内建表,可参考如下代码:

sql 复制代码
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  role VARCHAR(50),
  age INT
);

CREATE TABLE companies (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100)
);

main.go

安装gen

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

前大半部分为官方快速入门的代码,后尝试创建用户的部分可自行调整。

go 复制代码
package main

import (
	"context"
	"gorm-gen-demo/model"
	"gorm-gen-demo/query"
	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
	"log"
)

// Dynamic SQL
type Querier interface {
	// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
	FilterWithNameAndRole(name, role string) ([]gen.T, error)
}

func main() {
	dsn := "user:password@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"    //替换成自己的,此句两次执行代码均保留

    // ------------------------------- 官方代码
	gormdb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("failed to connect database: %v", err)
	}

	g := gen.NewGenerator(gen.Config{
		OutPath: "query",
		Mode:    gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate model
	})

	g.UseDB(gormdb) // reuse your gorm db

	// Generate basic type-safe DAO API for struct `model.User` following conventions
	g.ApplyBasic(model.User{})

	// Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`
	g.ApplyInterface(func(Querier) {}, model.User{}, model.Company{})

	// Generate the code
	g.Execute()

	// ------------------------------------上下两段代码可分两次执行
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	query.SetDefault(db)

	user := model.User{Name: "Modi", Age: 18}

	u := query.User
	ctx := context.Background()
	err = u.WithContext(ctx).Create(&user)

	if err != nil {
		log.Fatalf("failed to create user: %v", err)
	}

}

其中尝试创建用户部分,query.SetDefault(db)句不可少,否则会报错panic: runtime error: invalid memory address or nil pointer dereference

接下来两个文件都是在根目录下的model文件夹下新建,定义数据库表结构所用

user.go

go 复制代码
package model

type User struct {
	ID   int
	Name string
	Role string
	Age  int
}

company.go

go 复制代码
package model

type Company struct {
	ID   int
	Name string
}

生成效果


(更进一步)自定义dynamic SQL实践

如果添加了自定义注解的sql查询,需要先gen生成,然后再调用自定义的函数查询 !否则会报错,说不认识自定义的这个函数unresovled

代码:

go 复制代码
// Dynamic SQL
type Querier interface {
	// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
	// FilterWithNameAndRole(name, role string) ([]gen.T, error)

	// 添加注解和函数注册!!!
	//
	// SELECT * FROM @@table WHERE id=@id
	GetByID(id int) (gen.T, error) // returns struct and error
}

// main中添加绑定!!!
g.ApplyInterface(func(Querier) {}, model.User{})   // 绑定的是User结构体,所以只会在user.gen.go里注册和实现

写好注解和函数,进行g.Execute(),可以在user.gen.go里看到如下已经被注册的函数:

进行调用查询,添加代码:

go 复制代码
	res, err := query.User.WithContext(context.Background()).GetByID(1)
	if err != nil {
		fmt.Printf("GetByID failed , err:%v\n", err)
		return
	}
	fmt.Printf("GetByID result : %v", res)

查询结果:

第一遍生成,第二遍才是在调用GetByID这个新自定义函数

相关推荐
AgentOPC6 分钟前
Cerebras WSE-3 vs Nvidia H100/H200/B200:详细技术对比——谁才是 AI 时代真正的“芯片之王“
开发语言·人工智能·nvidia
qq_2518364579 分钟前
基于java 汽车检修管理系统设计与实现 论文
java·开发语言·汽车
lbaihao9 分钟前
LLVM Cpu0 调用规则解析
开发语言·前端·python·llvm
基德爆肝c语言11 分钟前
Qt系统相关
开发语言·qt
redaijufeng15 分钟前
C/C++程序从编译到链接的过程
c语言·开发语言·c++
木子墨51619 分钟前
系统设计面试 | 实现一个限流器:滑动窗口 → 令牌桶 → 漏桶
java·开发语言·数据结构·数据库·面试·职场和发展
Byte Wizard1 小时前
C语言指针深入浅出6
c语言·开发语言
知识分享小能手1 小时前
R语言入门学习教程,从入门到精通,R语言数据处理与清洗 (9)
开发语言·学习·r语言
计算机安禾1 小时前
【c++面向对象编程】第19篇:多继承与菱形继承(二):虚拟继承的内存模型与复杂性
开发语言·c++
思麟呀1 小时前
在C++基础上理解CSharp-1
开发语言·c++·c#