Go框架三件套:Gorm的基本操作

1.概述

这里的Go框架三件套是指 WebRPCORM框架,具体如下:

Gorm框架

gorm框架是一个已经迭代了10+年的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

Kitex框架

Kitex是字节内部的Golang微服务RPC框架,具有高性能、强可扩展的主要特点,支持多协议且拥有丰富的开源扩展。

Hertz框架

Hertz是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性等特点。


2.Gorm

什么是ORM?

ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单理解为一种框架的格式。

2.1 准备工作

image-20230125142805421

  • 开源地址
  • 官方文档

下载gorm

根据官方文档提供的方法,我们可以直接使用go get命令来获取gorm依赖。

go get -u gorm.io/gorm

image-20230125144018311


2.2 数据库连接

除了自定义开发驱动外,目前GORM官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

确定你需要使用的数据库类型之后,需要使用下面的命令安装对应的驱动依赖,下面以安装MySQL驱动为例,如果使用其他驱动依赖,只需要替换命令中driver后面的内容即可。

go get -u gorm.io/driver/mysql
func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接异常", err)
	}
	fmt.Printf("db:%v", db)
}

更多相关内容参考


2.3 基本使用

2.3.1 创建数据

介绍GORM的增删改查等基本操作。

  • 连接数据库以及初始化数据模型

可以通过使用default标签为字段设定默认值。

// User Article Product 定义go model
type User struct {
	Id         int    `gorm:"primaryKey"`
	UserName   string `gorm:"default:八尺妖剑"`
	Email      string `gorm:"ilikexff@gmail.com"`
	CreateTime time.Time
}

// 为model定义表名

func (u User) TableName() string {
	return "t_user"
}
  • 创建数据Create()

直接构建插入对象。

func main() {
    db, err := gorm.Open(
        mysql.Open("root:123456@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
    if err != nil {
        panic("数据库连接错误!")
    }
    //创建数据
    db.Create(&User{Id: 1, UserName: "李四", Email: "2217021563@qq.com", CreateTime: time.Now()})
    fmt.Printf("数据创建成功:%v", db)
	fmt.Printf("返回插入数据的主键:%v\n", user.Id)
	fmt.Printf("返回Error:%v\n", res.Error)
	fmt.Printf("返回插入记录的条数:%v\n", res.RowsAffected)
}

使用 指定字段创建记录。

res := db.Select("Id", "UserName", "CreateTime").Create(&user)
res := db.Create(&user)
fmt.Printf("返回插入数据的主键:%v\n", user.Id)
fmt.Printf("返回Error:%v\n", res.Error)
fmt.Printf("返回插入记录的条数:%v\n", res.RowsAffected)

创建一个记录且一同忽略传递给略去的字段值:人话就是除了传递过去的字段不需要创建之外,其他字段都要创建。

res := db.Omit("Email", "UserName").Create(&user)
fmt.Printf("返回插入数据的主键:%v\n", user.Id)
fmt.Printf("返回Error:%v\n", res.Error)
fmt.Printf("返回插入记录的条数:%v\n", res.RowsAffected)

使用分片批量创建数据。

var users = []User{
    {UserName: "汪淼", Email: "213213232@qq.com", CreateTime: time.Now()}, {UserName: "杨冬", Email: "213213232@qq.com", CreateTime: time.Now()}, {UserName: "叶文洁", Email: "213213232@qq.com", CreateTime: time.Now()}}
db.Create(&users)
for _, user := range users {
    fmt.Printf("批量创建之后的ID:%v\n", user.Id)
}

使用Map结构创建数据,这种方式创建记录时,association不会被调用且主键也不会自动填充。

// 根据Map结构创建数据-1
db.Model(&User{}).Create(map[string]interface{}{
    "UserName": "史强",
    "Email":    "32323442@qq.com",
})
//根据Map结构创建数据-2
db.Model(&User{}).Create([]map[string]interface{}{
    {"UserName": "梅艳芳", "Email": "323232@qq.com"},
    {"UserName": "张国荣", "Email": "43223235@qq.com"},
})

冲突处理,以遇到冲突时不处理冲突创建数据为例:

//冲突处理:不处理任何冲突创建数据
us := &User{UserName: "小二", Email: "3232322@qq.com"}
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&us)

关于更多创建数据的内容可参考


2.3.2 查询数据

根据主键检索。First()方法

var user User
fmt.Println("-------------------------------下面开始查询-----------------------------------------")
res := db.First(&user, 10)
//上面的语句等同于下面的语句
//db.First(&user,"10")
fmt.Printf("返回插入数据的主键:%v\n", user.Id)
fmt.Printf("返回Error:%v\n", res.Error)
fmt.Printf("返回插入记录的条数:%v\n", res.RowsAffected)

根据主键检索,使用Find()方法。

res := db.Find(&users, []int{1, 2, 3})
fmt.Printf("返回插入数据的主键:%v\n", user.Id)
fmt.Printf("返回Error:%v\n", res.Error)
fmt.Printf("返回查询记录的条数:%v\n", res.RowsAffected)

检索单个对象,GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。

//获取第一条记录,按主键升序
db.First(&user)
//获取第一条记录,没有指定排序字段
db.Take(&user)
//获取最后一条记录(按主键降序)
db.Last(&user)

查询全部对象。

result := db.Find(&users)

条件查询,String条件。

//条件查询-根据条件获取一条记录
//SELECT * FROM users HWERE name = '李四' ORDER BY id LIMIT 1;
res := db.Where("user_name=?", "李四").First(&user)
PrintfRes(res)

//SELECT * FROM users HWERE name<> '王五'
res1 := db.Where("user_name<> ?", "王五").Find(&users)
PrintfRes(res1)

//IN
//SELECT * FROM users WHERE user_name IN('李四','李四2')
res2 := db.Where("user_name IN ?", []string{"李四", "李四2"}).Find(&users)
PrintfRes(res2)

//LIKE
//SELECT * FROM users WHERE user_name LIKE '%李%'
res3 := db.Where("user_name LIKE?", "%李%").Find(&users)
PrintfRes(res3)

//AND
//SELECT * FROM t_user WHERE user_name = '李四' AND id >=1
res4 := db.Where("user_name=? AND id >= ?", "李四", 1).Find(&users)
PrintfRes(res4)
}

条件查询,Struct & Map 条件。

//Struct
//SELECT * FROM user WHERE user_name = ”李四“ AND email = "2217021563@qq.com" ORDER BY id LIMIT 1;
res6 := db.Where(&User{UserName: "李四", Email: "2217021563@qq.com"}).First(&user)
PrintfRes(res6)

//Map
//SELECT * FROM user WHERE user_name = "李四" AND email = "2217021563@qq.com"
res7 := db.Where(map[string]interface{}{"user_name": "李四", "email": "2217021563@qq.com"}).Find(&users)
PrintfRes(res7)

更多关于查询的内容可参考


2.3.3 更新数据

Save()方法,保存所有的字段,即使字段是零值。

db.First(&user)
user.UserName = "字节"
user.Email = "11111111@qq.com"
res := db.Save(&user)
PrintfRes(res)

条件更新,使用条件更新单个列。

//2.条件更新
UPDATE user SET user_name = '跳动'
res1 := db.Model(&User{}).Where("active = ?", 1).Update("user_name", "跳动")
PrintfRes(res1)

//使用默认主键ID更新
res3 := db.Model(&user).Update("user_name", "hello")
PrintfRes(res3)

//根据条件和model的值进行更新
//UPDATE users SET user_name = "yes", WHERE id = 1 AND active = 1
res4 := db.Model(&user).Where("active", 1).Update("user_name", "yes")
PrintfRes(res4)

多列更新,Updates 方法支持 structmap[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段。

//根据 struct更新属性,只会更新非零字段
res := db.Model(&user).Updates(User{UserName: "张国荣", Email: "00000000@qq.com", Active: 1})
PrintfRes(res)

//根据map更新数据
res2 := db.Model(&user).Updates(map[string]interface{}{"user_name": "哥哥", "email": "2222222@qq.com", "active": 0})
PrintfRes(res2)

更新和排除指定字段

//更新指定字段
db.Model(&user).Select("user_name").Updates(map[string] interface{}{"user_name":"利好","email:":"9999999999@qq.com"})

//排除指定字段
db.Model(&user).Omit("user_name").Updates(map[string] interface{}{"user_name":"李彦宏","email":"4444444444@qq.com"})

更多关于数据更新的内容可参考


2.3.4 删除数据

根据主键删除。GORM 允许通过主键(可以是复合主键)和内联条件来删除对象,它可以使用数字(如以下例子。也可以使用字符串——译者注)。查看 查询-内联条件(Query Inline Conditions) 了解详情。

//根据主键删除,ID可以时strin 	db.Delete(&User{},"10")
db.Delete(&User{}, 14)
//根据多个ID删除数据
db.Delete(&user, []int{5, 6, 7})

删除一条记录,删除一条记录时,删除对象需要指定主键,否则会触发 批量 Delete

user.Id = 4
//删除一条记录(ID==2)
db.Delete(&user)
//带额外条件的删除
db.Where("user_name = ?", "Tom").Delete(&user)

批量删除,如果指定不包括主属性,那么GORM会执行批量删除,它将删除所有匹配的记录。

//批量删除
db.Where("email LIKE ?", "%213213%").Delete(&user)
//db.Delete(&User{},"email LIKE ?" ,"%213213%")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初始Django

初始Django 一、Django的历史 ​ Django 是从真实世界的应用中成长起来的&#xff0c;它是由堪萨斯&#xff08;Kansas&#xff09;州 Lawrence 城中的一个网络开发小组编写的。它诞生于 2003 年秋天&#xff0c;那时 Lawrence Journal-World 报纸的程序员 Adrian Holovaty 和…

泽攸科技无掩模光刻机:引领微纳制造新纪元

在当今科技迅猛发展的时代&#xff0c;微纳制造技术正变得越来越重要。泽攸科技作为这一领域的先行者&#xff0c;推出了其创新的无掩模光刻机&#xff0c;这一设备在微电子制造、微纳加工、MEMS、LED、生物芯片等多个高科技领域展现出了其独特的价值和广泛的应用前景。 技术革…

ubuntu中安装sublime-text

安装sublime-text 直接在software软件下载就好 安装成功后&#xff0c;如果找不到的话&#xff0c;可以在这里搜索。而后添加到收藏文件夹中。 下载的时候发生报错&#xff0c;发现是没有安装 ca-certificates 的软件包 &#xff1a; 命令&#xff1a; sudo apt install ca-c…

【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)

今天是第六专题&#xff0c;主要内容是&#xff1a;导入ArduinoJson功能库&#xff0c;借助该库解析从【心知天气】官网返回的JSON数据&#xff0c;并显示在 TFT 屏幕上。 如您需要了解其它专题的内容&#xff0c;请点击下面的链接。 第一专题内容&#xff0c;请参考&a…

uniapp小程序:大盒子包裹小盒子但是都有点击事件该如何区分?

在开发过程中我们会遇到这种情况&#xff0c;一个大盒子中包裹这一个小盒子&#xff0c;两个盒子都有点击事件&#xff0c;例如&#xff1a; 这个时候如果点击评价有可能会点击到它所在的大盒子&#xff0c;如果使用css中的z-index设置层级的话如果页面的盒子多的话会混乱&…

AI工具的热门与卓越:揭示AI技术的实际应用和影响

文章目录 每日一句正能量前言常用AI工具创新AI应用个人体验分享后记 每日一句正能量 我们在我们的劳动过程中学习思考&#xff0c;劳动的结果&#xff0c;我们认识了世界的奥妙&#xff0c;于是我们就真正来改变生活了。 前言 随着人工智能&#xff08;AI&#xff09;技术的快…

极端天气对气膜建筑有什么影响吗—轻空间

气膜建筑在近年来的发展迅速&#xff0c;逐渐替代了一部分传统建筑&#xff0c;展现了良好的市场前景。然而&#xff0c;面对自然环境中的极端天气&#xff0c;如暴风、暴雨和暴雪&#xff0c;气膜建筑是否能够经受住考验是大家关注的焦点。轻空间带您探讨一下这些极端天气对气…

【漏洞复现】泛微OA E-Cology ResourceServlet文件读取漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology ResourceServlet存在任意文件读取漏洞&#xff0c;允许未经授权的用户…

Nurbs曲线

本文深入探讨了Nurbs曲线的概念、原理及应用&#xff0c;揭示了其在数字设计领域的独特价值和广泛影响。Nurbs曲线作为一种强大的数学工具&#xff0c;为设计师们提供了更加灵活、精确的曲线创建方式&#xff0c;从而极大地提升了设计作品的质感和表现力。文章首先介绍了Nurbs曲…

大数据之 Hadoop概述

用最简洁的语言跟大家表达我最想分享的知识 。 什么是Hadoop Hadoop框架核心模块 HDFS MapReduce Yarn Hive HBase Phoenix Zookeeper Impala Spark 分布式计算-Spark与Impala与Presto与Tez 今天主要跟大家简述一下hadoop&#xff0c;主要是图片的形式跟大家介绍&#xff0c;希…

Rpcx (二):传输

一、Transport 传输 rpcx 可以通过 TCP、HTTP、UnixDomain、QUIC和KCP通信。你也可以使用http客户端通过网关或者http调用来访问rpcx服务。 TCP 这是最常用的通信方式。高性能易上手。可以使用TLS加密TCP流量。 Example: 101basic 服务端使用 tcp 做为网络名并且在注册中心…

稚晖君独家撰文:具身智能即将为通用机器人补全最后一块拼图

具身智能新纪元。 *本文为稚晖君独家供稿,「甲子光年」经智元机器人授权发布。稚晖君本名彭志辉,先后任职OPPO、华为,现为智元机器人CTO、首席架构师。 在ChatGPT之后,又一个大模型概念火了——具身智能(Embodied AI)。 在学术界,图灵奖得主、上海期智研究院院长姚期…

IOS 苹果IAP(内购)之创建沙盒账号

IOS 苹果IAP&#xff08;内购&#xff09;之创建沙盒账号 沙盒账号是什么&#xff1f;沙盒账号创建的前提条件沙盒账号创建沙盒账号使用流程沙盒账号注意事项 沙盒账号是什么&#xff1f; 如果IOS应用里面用到了苹果应用内付费&#xff08;IAP&#xff09;功能&#xff0c;那么…

办公软件_EdrawMax 免安装版教程 (亿图图示综合图形图表设计软件)

前言 万兴亿图图示(Wondershare EdrawMax)是一款综合图形图表设计软件,Visio国产替代.亿图图示中文版(Edraw Max)是一款办公绘图软件的思维导图软件.无需任何绘图功底,即可轻松创建各类思维导图.亿图图示专家,提供大量事例和在线模板,用于创建流程图,信息图,组织结构图,科学教…

面试题:调整数字顺序,使奇数位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分 算法1&#xff1a; 利用快速排序的一次划分思想&#xff0c;从2端往中间遍历 时间复杂度&#x…

day5

利用迭代器&#xff01; #include <vector> #include <map>class Solution { public:std::vector<int> intersection(std::vector<int>& nums1, std::vector<int>& nums2) {std::map<int, int> Mymap;std::vector<int> qq…

金万维动态域名小助手怎么用?

金万维动态域名小助手是一个域名检测工具&#xff0c;使用此工具可以进行检测域名解析是否正确、清除DNS缓存、修改DNS服务器地址及寻找在线客服&#xff08;仅支持付费用户&#xff09;等操作。对不懂网络的用户是一个很好的检测域名的工具&#xff0c;下面我就讲解一下金万维…

面试中的算法(查找缺失的整数)

在一个无序数组里有99个不重复的正整数&#xff0c;范围是1~100&#xff0c;唯独缺少1个1~100中的整数。如何找出这个缺失的整数? 一个很简单也很高效的方法&#xff0c;先算出1~100之和&#xff0c;然后依次减去数组里的元素&#xff0c;最后得到的差值&#xff0c;就是那个缺…

ARM架构安全特性之通用平台安全服务

安全之安全(security)博客目录导读 目录 一、符合PSA认证标准 二、Arm平台安全规范 三、跨安全边界通信 四、FF-A 五、FF-M 六、开放和标准设备固件 七、Trustedfirmware.org 在一个需要高度信任设备的世界中&#xff0c;每个设备都必须是独一无二的可识别的、不可克隆…

网站服务器备案及域名购买配置教程

一、阿里云服务备案准备工作 1.什么是备案? 备案是指向相关部门提交网站信息,以便监管和管理互联网信息服务,未经备案的网站可能面临罚款甚至被关闭的风险。备案主要看您的网站或App等互联网信息服务解析到的服务器是否在中国内地(大陆),如果服务器在中国内地(大陆),…