当前位置: 首页 > news >正文

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

文章目录

  • 建项目
  • 建库建表
  • main.go
  • user.go
  • company.go
  • 生成效果
  • (更进一步)自定义dynamic SQL实践

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

以mysql为例

建项目

go mod init 项目名称
go mod tidy

建库建表

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

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

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 get -u gorm.io/gen

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

package mainimport ("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 conventionsg.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 codeg.Execute()// ------------------------------------上下两段代码可分两次执行db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})query.SetDefault(db)user := model.User{Name: "Modi", Age: 18}u := query.Userctx := 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

package modeltype User struct {ID   intName stringRole stringAge  int
}

company.go

package modeltype Company struct {ID   intName string
}

生成效果

在这里插入图片描述
在这里插入图片描述

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

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

代码:

// 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=@idGetByID(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里看到如下已经被注册的函数:

在这里插入图片描述

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

	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这个新自定义函数

在这里插入图片描述

http://www.dtcms.com/a/279530.html

相关文章:

  • Go迭代器完全指南:从基础到实战
  • MYOJ_8512:CSP初赛题单1:计算机常识
  • Unsloth 实战:DeepSeek-R1 模型高效微调指南(下篇)
  • ECUs、ZCUs、CCUs:产生的软件栈(SW stack)也有所不同
  • C++-linux 7.文件IO(三)文件元数据与 C 标准库文件操作
  • 七彩喜平台:养老行业的 “智慧革命”,老年人的 “幸福驿站”
  • 网络安全|网络准入控制系统有哪些?网络准入控制系统十大解决方案详解
  • winfom自定义一个椭圆按钮
  • Codex,Copilot 是什么
  • 艺术总监的构图“再造术”:用PS生成式AI,重塑照片叙事框架
  • Vim库函数
  • NE综合实验2:RIP 与 OSPF 动态路由精细配置及ACL访问控制列表
  • pycharm连接远程终端的Anaconda安装与bug记录
  • 洛谷【数学 1】基础数学问题:最小公倍数的计算与应用
  • ELK、Loki、Kafka 三种日志告警联动方案全解析(附实战 Demo)
  • mysql 与redis缓存一致性,延时双删 和先更新数据库,再删除缓存,哪个方案好
  • 系统思考:跨境跨界团队学习
  • 安装Keycloak并启动服务(macOS)
  • SpringMVC4
  • 用基础模型构建应用(第九章)AI Engineering: Building Applications with Foundation Models学习笔记
  • mac安装nvm执行命令报错-解决方案
  • 延迟双删
  • redis面试高频问题汇总(一)
  • 中间件部署
  • Android 16k jni修改
  • 进阶03 二叉树进阶
  • Linux ACL权限策略
  • The Network Link Layer: WSNs 泛洪和DSR动态源路由协议
  • 《星盘接口3:虚无之眼的觉醒》
  • 机载激光雷达目标识别:从点云到凝视成像的算法全景