文章目录

  • 建项目
  • 建库建表
  • 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.pswp.cn/web/89164.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89164.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89164.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞书 “打破” AI 与协同办公的「黑箱」

文 | 智能相对论作者 | 陈泊丞在协同办公领域,自从有了AI,微软、钉钉、Google Workspace、Salesforce、企业微信、飞书等厂商都试图通过深度整合AI技术,从智能会议、内容创作、数据管理等场景重构办公范式。微软通过Microsoft 365 Copilot将A…

leetcode:674. 最长连续递增序列[动归]

学习要点 练习动归注意不要马虎 题目链接 674. 最长连续递增序列 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法&#xff1a;动归 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();if(nums.size() < 1) …

【html常见页面布局】

考拉商城界面效果htmlcss效果 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

摩尔线程MUSA架构深度调优指南:从CUDA到MUSA的显存访问模式重构原则

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 当国产GPU面临生态壁垒&#xff0c;显存访问效率成为性能突破的关键战场。本文将深入揭示摩尔…

2025江苏省信息安全管理与评估赛项二三阶段任务书

任务 3 网络安全事件响应、数字取证调查、网络安全渗透任务3.1&#xff1a;网络安全事件响应&#xff08;100分&#xff09;X集团的一台存储关键信息的服务器遭受到了黑客的攻击&#xff0c;现在需要你对该服务器进行应急排查&#xff0c;该服务器的系统目录被上传恶意文件&…

核电概念盘中异动,中核科技涨停引领板块热度

今日股市交易时段&#xff0c;核电概念板块表现活跃&#xff0c;中核科技强势涨停&#xff0c;成为市场关注焦点&#xff0c;为核电产业链相关投资与发展增添新的动态信号。中核科技作为核电阀门等关键设备领域的重要企业&#xff0c;其涨停背后&#xff0c;是多重因素共同作用…

《Java语言程序设计》1.2.3复习题

缩写"CPU"代表什么含义?测量CPU速度的单位是什么?中央处理器(Central Processing Unit,CPU)是计算机的大脑。它从内存中获取指令并执行这些指令。CPU通常由两部分组成&#xff1a;控制单元(control unit)和算术/逻辑单元(arithmetic/logic unit)。控制单元用于控制…

【迭代】绘本生成方案迭代2,解决录音播放问题

代码分享】AI辅助编程&#xff1a;动手制作绘本生成器&#xff0c;实现绘本自由 前面分享了生成绘本PDF的方案&#xff0c;只有图片和文字。所以想加上文字的录音播放。 经过一番探索&#xff0c;发现要实现这个功能的可行性高的方案是用户点击播放&#xff0c;需要跳转到浏览…

C++设计模式之创建型模式

1.前言 设计模式一共有23种&#xff0c;主要分为三大类型&#xff1a;创建型&#xff0c;结构型&#xff0c;行为型。本篇文章着重讲解的是创建型一些相关的设计模式 2.单例模式 Singleton 模式是设计模式中最为简单、最为常见、最容易实现&#xff0c;也是最应该熟悉和掌握的…

kubernetes学习笔记(一)

kubernetes学习笔记(一) kubernetes简介 ​ Kubernetes是Google开源的一个容器编排引擎&#xff0c;它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时&#xff0c;通常要部署该应用的多个实例以便对应用请求进行负载均衡。 ​ 在Kubernetes…

Eureka实战

1.创建父工程SpringCloudTestSpringCloudTest为父工程&#xff0c;用于引入通用依赖&#xff0c;如spring-boot-starter-web、lombok&#xff0c;这样子工程就可以直接继承&#xff0c;无需重复引入。在dependencyManagement标签中引入和springboot版本对应的springcloud&#…

如何把镜头对焦在超焦距上

要把镜头对焦在超焦距上&#xff0c;可以按照以下步骤操作&#xff1a;1. 计算超焦距 首先需要知道你的镜头参数和相机参数&#xff1a; 焦距 f&#xff08;如 24mm、35mm&#xff09;光圈 N&#xff08;如 f/8、f/11&#xff09;容许弥散圆直径 c&#xff08;与传感器尺寸有关…

idea docker插件连接docker失败

报错org.apache.hc.client5.http.HttpHostConnectException:Connect to http://localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:o:0:0:0:1] failed:Connection refused:getsockopt解决方法&#xff1a;

【后端】.NET Core API框架搭建(6) --配置使用MongoDB

目录 1.添加包 2. 连接配置 2.1.链接字符串 2.2.连接类 3.仓储配置 3.1.仓储实现 3.2.仓储接口 4.获取配置和注册 4.1.添加配置获取方法 4.2.注册 5.常规使用案例 5.1实体 5.2.实现 5.3.接口 5.4.控制器 NET Core 应用程序中使用 MongoDB 有许多好处&#xff0c;尤其是在…

Spring AI快速入门

文章目录1 介绍1_大模型对比2_开发框架对比2 快速入门1_引入依赖2 配置模型3 配置客户端4 测试3 会话日志1_Advisor2 添加日志Advisor4 会话记忆1_定义会话存储方式2 配置会话记忆Advisor5 会话历史1_管理会话历史2 保存会话id3 查询会话历史6 后续1 介绍 SpringAI整合了全球&…

Windows下编译pthreads

本文记录在Windows下编译pthreads的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1MSYS2msys2-x86_64-20240507Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译安装 1.1 下载 git clone https://git.code.sf.net/p/pthreads4w/code 1.2 构建…

WP Force SSL Pro – HTTPS SSL Redirect Boost Your Website‘s Trust in Minutes!

In the vast digital landscape where security and user trust are paramount, ensuring your WordPress site uses HTTPS is not just a recommendation—it’s a necessity. That’s where WP Force SSL Pro – HTTPS SSL Redirect steps in as your silent guardian, makin…

jvm--java代码对照字节码图解

java代码&#xff1a;无静态方法&#xff1b;&#xff08;对应字节码没有方法&#xff09; 任何一个类&#xff0c;至少有一个构造器&#xff0c;默认是无参构造java代码包含&#xff1a;静态方法java代码包含&#xff1a;静态方法、显示构造方法public class ClassInitTest {p…

动态规划题解_打家劫舍【LeetCode】

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

电脑安装 Win10 提示无法在当前分区上安装Windows的解决办法

原因&#xff1a; win10系统均添加快速启动功能&#xff0c;预装的win10电脑默认都是UEFI引导和GPT硬盘&#xff0c;传统的引导方式为Legacy引导和MBR硬盘&#xff0c;UEFI必须跟GPT对应&#xff0c;同理Legacy必须跟MBR对应。如果BIOS开启UEFI&#xff0c;而硬盘分区表格式为M…