gorm的自动化工具gen_已设置图床

news2024/12/23 0:13:13

gorm的自动化工具gen

官方

https://gorm.io/zh_CN/gen/

假设数据库结构如

Image1

这里使用gen-tool

安装

go install gorm.io/gen/tools/gentool@latest

用法

gentool -h

Usage of gentool:
 -c string
       配置文件名、默认值 “”、命令行选项的优先级高于配置文件。 
 -db string
       指定Driver,默认值“mysql”,referer:https://gorm.io/docs/connecting_to_the_database.html
 -dsn string
       用于连接数据库的DSN reference: https://gorm.io/docs/connecting_to_the_database.html
 -fieldNullable
       当字段允许空时用指针生成
 -fieldWithIndexTag
       生成带有gorm index 标签的字段
 -fieldWithTypeTag
       生成带有gorm type标签的字段
 -modelPkgName string
       生成模型代码包名称。
 -outFile string
       Genrated 查询代码文件名称,默认值:gen.go
 -outPath string
       指定输出目录(默认 “./dao/query”)
 -tables string
       指定要生成的表名称,默认所有表。
 -onlyModel
       指生成Models不生成对应的query
 -withUnitTest
       生成单元测试,默认值 false, 选项: false / true
 -fieldSignable
       detect integer field's unsigned type, adjust generated data type

Example

gentool -dsn "user:pwd@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local" -tables "orders,doctor"

gentool -c "./gen.tool" # 配置文件像下面
version: "0.1"
database:
  # consult[https://gorm.io/docs/connecting_to_the_database.html]"
  dsn : "username:password@tcp(address:port)/db?charset=utf8mb4&parseTime=true&loc=Local"
  # 选择mysql或者其他引擎,比方sqlserver
  db  : "mysql"
  # 指定要生成的table,流控则全部
  tables  : "user"
  # 指定输出目录
  outPath :  "./dao/query"
  # 输出的代码,默认gen.go
  outFile :  ""
  # 是否生成单元测试
  withUnitTest  : false
  # generated model code's package name
  # 生成的model的代码的包名
  modelPkgName  : ""
  # 使用指针当字段是空的
  fieldNullable : false
  # 生成的字段带有gorm tag
  fieldWithIndexTag : false
  # 生成的字段时候带有gorm type 标签
  fieldWithTypeTag  : false

ubuntu将gobin加入到PATH的做法

个人来说,gentool没有被加入到PATH中,这边手动把GOPATH加入到PATH中,我用的是

zsh,所以把环境变量加入到~/.zshrc中,参考下面的命令

Image2

echo 'export PATH=$PATH:~/go/bin' | tee -a ~/.zshrc

现在gentool可以在任意地方被调用了

Image3

实例

在项目根目录新疆gentool文件里面写入内容

version: "0.1"
database:
  # consult[https://gorm.io/docs/connecting_to_the_database.html]"
  dsn : "root:root@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=true&loc=Local"
  # 选择mysql或者其他引擎,比方sqlserver
  db  : "mysql"
  # 指定要生成的table,流控则全部
  # 指定输出目录
  outPath :  "./dao/query"
  # 输出的代码,默认gen.go
  outFile :  ""
  # 是否生成单元测试
  withUnitTest  : false
  # generated model code's package name
  # 生成的model的代码的包名
  modelPkgName  : "models"
  # 使用指针当字段是空的
  fieldNullable : false
  # 生成的字段带有gorm tag
  fieldWithIndexTag : false
  # 生成的字段时候带有gorm type 标签
  fieldWithTypeTag  : false

然后使用gentool指定-c

结果如在dao包下生成了对应的models和query

Image4

使用gen代码工具的参合

package main

// gorm gen configure

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"

	"gorm.io/gen"
)

const MySQLDSN = "root:root@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=True"

func connectDB(dsn string) *gorm.DB {
	db, err := gorm.Open(mysql.Open(dsn))
	if err != nil {
		panic(fmt.Errorf("connect db fail: %w", err))
	}
	return db
}

func main() {
	// 指定生成代码的具体相对目录(相对当前文件),默认为:./query
	// 默认生成需要使用WithContext之后才可以查询的代码,但可以通过设置gen.WithoutContext禁用该模式
	g := gen.NewGenerator(gen.Config{
		// 默认会在 OutPath 目录生成CRUD代码,并且同目录下生成 model 包
		// 所以OutPath最终package不能设置为model,在有数据库表同步的情况下会产生冲突
		// 若一定要使用可以通过ModelPkgPath单独指定model package的名称
		OutPath: "dal/query",
		/* ModelPkgPath: "dal/model"*/

		// gen.WithoutContext:禁用WithContext模式
		// gen.WithDefaultQuery:生成一个全局Query对象Q
		// gen.WithQueryInterface:生成Query接口
		Mode: gen.WithDefaultQuery | gen.WithQueryInterface,
	})

	// 通常复用项目中已有的SQL连接配置db(*gorm.DB)
	// 非必需,但如果需要复用连接时的gorm.Config或需要连接数据库同步表信息则必须设置
	g.UseDB(connectDB(MySQLDSN))

	// 从连接的数据库为所有表生成Model结构体和CRUD代码
	// 也可以手动指定需要生成代码的数据表
	g.ApplyBasic(g.GenerateAllTable()...)

	// 执行并生成代码
	g.Execute()
}

实际上生成的代码与gentool一样

Image5

如何使用生成的代码?

  1. 首先生成代码

  2. 然后

  3. Image6

  4. 可以参考如下增删改查

  5. ` - ```

func main() {
// 设置默认DB对象
query.SetDefault(dal.DB)

// 创建
b1 := model.Book{
	Title:       "《Go语言之路》",
	Author:      "七",
	PublishDate: time.Date(2023, 11, 15, 0, 0, 0, 0, time.UTC),
	Price:       100,
}
err := query.Book.WithContext(context.Background()).Create(&b1)
if err != nil {
	fmt.Printf("create book fail, err:%v\n", err)
	return
}

// 更新
ret, err := query.Book.WithContext(context.Background()).
	Where(query.Book.ID.Eq(1)).
	Update(query.Book.Price, 200)
if err != nil {
	fmt.Printf("update book fail, err:%v\n", err)
	return
}
fmt.Printf("RowsAffected:%v\n", ret.RowsAffected)

// 查询
book, err := query.Book.WithContext(context.Background()).First()
// 也可以使用全局Q对象查询
//book, err := query.Q.Book.WithContext(context.Background()).First()
if err != nil {
	fmt.Printf("query book fail, err:%v\n", err)
	return
}
fmt.Printf("book:%v\n", book)

// 删除
ret, err = query.Book.WithContext(context.Background()).Where(query.Book.ID.Eq(1)).Delete()
if err != nil {
	fmt.Printf("delete book fail, err:%v\n", err)
	return
}
fmt.Printf("RowsAffected:%v\n", ret.RowsAffected)

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1190521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机芯智能】智能公元(语音模块)

语音模块配置 进入语音模块智能公元官网,配置词条和识别后的串口输出指令. 记录下相关指令以及上图的识别词条,方便SDK烧写后的调试 SDK烧写 4. SDK 先和电脑调试助手配合,验证数据

Linux开发工具之自动化构建工具-make/Makefile

文章目录 1.make/Makefile的介绍2.简单编写及使用3.ACM时间4.extern的复习5.多文件的编译5.0复习翻译过程5.1多文件的构成5.2手动编译5.3利用Makefile 1.make/Makefile的介绍 make是一个命令 makefile是一个文件[makefile也对] 之前的学习都没有维护项目结构 当有多个.c文件 先…

Triples of Cows

题目传送门 引 模拟赛 T 4 T4 T4 , 变换挺妙的, 而且感觉转换后问题就迎刃而解了 解法 强行模拟拆点重连边显然不行,会让图的边数达到 n 2 n^2 n2 级别的 —————————————————————————————————————————————————— 考虑转…

μC/OS-II---内核:任务Task

目录 内核:多任务(ucos_ii.h文件的函数)Task创建Task创建(扩展)Task删除/请求删除Task改变Task优先级Task挂起和恢复Task信息获取Task调度器上锁和开锁 内核:多任务(ucos_ii.h文件的函数&#x…

计算机底层的秘密 摘抄笔记

https://www.bookstack.cn/read/webxiaohua-gitbook/README.md 大部分是摘抄 机器指令需要加载到内存中执行,因此需要记录下内存的起始地址和长度;同时要找到函数的入口地址并写到PC寄存器中,想一想这是不是需要一个数据结构来记录下这些信…

springCloud和dubbo的区别

两者都是现在主流的微服务框架,但却存在不少差异: 初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理生态环境不同:SpringCloud依…

Bean——IOC(Github上有代码)

源码 https://github.com/cmdch2017/Bean_IOC.git 获取Bean对象 BeanFactory Bean的作用域 第三方Bean需要用Bean注解 比如消息队列项目中,需要用到Json的消息转换器,这是第三方的Bean对象,所以不能用Component,而要用Bean …

C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍

文章目录 插入排序希尔排序冒泡排序选择排序快速排序 本文主要介绍用C语言实现的一些排序方法,有插入排序、希尔排序、冒泡排序、选择排序和快速排序,文章中给出的例子都是按照升序排列的。 插入排序 若数组只有一个元素,自然不用排序&#…

[C]环境(0/0)→ 环境配置

这里写目录标题 0x00 额环境下载解压 0x00 额 写了那么多C的入门,就是没写C语言的环境配置,乘此机会写了吧。 环境下载 直接在我这下载就好了,毕竟用了挺久没啥问题的 C语言环境(gcc version 8.1.0) 解压 最后得到…

【JAVA学习笔记】66 - 本章作业(IO流)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai/homework 1.使用File类和FileWriter类 (1)在判断e盘下是否有文件夹mytemp,如果没有就创建mytemp public class Homework01 {public static void main(String…

大数据技术从业者注意了!使用代理IP时避开这些误区

作为一名专业的大数据从业者,我经常需要使用HTTP代理IP进行数据爬取工作。在这个过程中,我积累了一些关于使用代理IP的经验,同时也发现了一些新手常见的误区,这些误区可能会影响你的工作的效率和数据准确性。我将分享一些关于使用…

使用超融合,网络交换机如何选型与配置?

很多用户在部署超融合集群时,都会关注网络交换机的选型与配置。我们在这篇文章中整理了一些关于网络交换机的常见提问,并邀请 SmartX 技术专家进行了详细解答。 Q1. 超融合架构下,网络交换机是如何部署的?需要多少台交换机&#x…

黑芝麻智能与香港科技园签订合作备忘录,迈向全球化发展新阶段

11月6日,黑芝麻智能与香港科技园公司举行合作签约仪式,双方将合力推动黑芝麻智能香港科技创新研发中心在科技园落地,并促进园区打造车规级高性能智能汽车计算芯片平台。黑芝麻智能首席市场营销官杨宇欣、香港科技园公司首席企业发展总监姚庆良…

学妹刚毕业那天,我连夜用Python采集了上万份岗位数据,只为给她找一份好工作

记得学妹刚毕业那天,为了不让学妹毕业就失业,连夜我就用Python采集了上万份岗位,分析出最合适她的工作。 为此,学妹连夜来我家表示感谢😍 我们开始今天的正题吧 首先要准备这些 软件 Python 3.8Pycharm 模块使用 …

棱镜七彩加入UOS主动安全防护计划(UAPP),共建信创生态

近日,在统信UOS主动安全防护计划(UAPP)技术沙龙上,2023年度第二期UAPP合作伙伴授牌发布仪式正式举行。棱镜七彩作为国内专注开源安全与软件供应链安全的创新型厂商,正式获得官方授牌,成为 UAPP 成员单位。 …

2021年09月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 对于数列3,8,11,15,17,19,25,30,44,采用“二分查找”法查找8,需要查找多少次? A:5 B:4 C:3 D:2 答案:D 按二分查找法的规律,每次先查找中间值,进行比较。 第2题…

在vue中如果头像为空时用姓名第一个字当头像

业务场景:当个人资料或者用户头像没有图片时&#xff0c;默认使用户名字中第一个汉字做头像。 效果图&#xff1a; 完整代码&#xff1a; <el-avatarsize"large" style"width: 45px; height: 45px; line-height: 45px; font-size: 24px"v-if"…

无需开发,精臣云可轻松连接用户运营、广告推广等行业应用

精臣智慧标识科技有限公司简介 武汉精臣智慧标识科技有限公司&#xff0c;是国内便携式标签打印机创新品牌和实物管理解决方案服务商。在物品标签还处在繁琐的PC打印时代&#xff0c;精臣公司便创造性地从智能便携角度出发&#xff0c;顺应移动互联时代趋势&#xff0c;推出了…

HarmonyOS开发:回调实现网络的拦截

前言 上一篇文章&#xff0c;分享了一个基于http封装的一个网络库&#xff0c;里面有一个知识点&#xff0c;在初始化的时候&#xff0c;可以设置请求头拦截和请求错误后的信息的拦截&#xff0c;具体案例如下&#xff1a; Net.getInstance().init({netErrorInterceptor: new M…

1995-2020年全国各省二氧化碳排放量面板数据

1995-2020年全国各省二氧化碳排放面板数据 1、时间&#xff1a;1995-2020 2、范围&#xff1a;全国、30省 3、来源&#xff1a;中国能源统计NJ 4、指标&#xff1a; 统计年度、地区代码、地区名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧…