GORM的常见命令

文章目录

  • 一、什么是GORM?
  • 二、GORM连接mysql以及AutoMigrate创建表
  • 三、查询
    • 1、检索此对象是否存在于数据库(First,Take,Last方法)
    • 2、Find()方法检索
    • 3、根据指定字段查询
  • 四、更新
    • 1、Save() 保存多个字段
    • 2、更新单个字段
  • 五、删除

一、什么是GORM?

GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来将 Go 结构体映射到数据库表,并提供了丰富的方法来操作数据库,比如查询、插入、更新和删除数据等。

二、GORM连接mysql以及AutoMigrate创建表

使用GORM之前先获取包:

go get "gorm.io/driver/mysql"
go get "gorm.io/gorm"

数据库的连接:

	db, _ = gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",}), &gorm.Config{SkipDefaultTransaction:                   true, // 禁用默认事务(提高运行速度)DisableForeignKeyConstraintWhenMigrating: true, // 禁用外键约束NamingStrategy: schema.NamingStrategy{//TablePrefix:   "t_", // 表名前缀,`User` 的表名应该是 `t_users`SingularTable: true, // 使用单数表名,启用该选项},})

使用AutoMigrate自动创建表,在这里我们就要知道GORM里的模型是什么意思。
模型是使用普通结构体定义的。
也就是说,数据库中的表是根据我们自己建立的结构体生成的,我们可以在设计结构体的时候,在后边加上gorm的一些限制,然后自动迁移就可以在数据库中生成了。

gorm.Model

type Model struct {ID        uint `gorm:"primarykey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt DeletedAt `gorm:"index"`
}

这是gorm已经定义好的结构体,可以直接使用。

案例1:创建一个用户表自动迁移到数据库中。

type User struct {gorm.ModelName stringAge  int
}func main() {db.AutoMigrate(&User{}) //自动迁移这个表user := User{Name: "张三",Age:  18,}rest := db.Create(&user)fmt.Println(user.ID) // 主键IDfmt.Println(rest.RowsAffected)fmt.Println(rest.Error)
}

案例2:自动创建一个嵌套的表组合。

type User struct {gorm.ModelName stringAge  int
}type Work struct {UserWork string
}func main() {err := db.AutoMigrate(&Work{}) //自动迁移这个表if err != nil {fmt.Println(err)}work := Work{User: User{Name: "张三", Age: 18}, Work: "程序员"}db.Create(&work)fmt.Println(work.ID)
}

三、查询

以下所有操作的基本数据库信息如下:
在这里插入图片描述

1、检索此对象是否存在于数据库(First,Take,Last方法)

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

	//查询张三是否在数据库中//SELECT * FROM `work` WHERE name = '张2三' AND `work`.`deleted_at` IS NULL ORDER BY `work`.`id` LIMIT 1var work1 Workresult := db.Where("name = ?", "张三").First(&work1)if result.Error != nil {if errors.Is(result.Error, gorm.ErrRecordNotFound) {fmt.Println("没找到记录")return}fmt.Println(result.Error)return}fmt.Println(result.RowsAffected) // 受影响的行数

2、Find()方法检索

	// 查询age=20的所有的信息var works []Workresult = db.Where("age = ?", 20).Limit(1).Find(&works)if result.Error != nil {if errors.Is(result.Error, gorm.ErrRecordNotFound) {fmt.Println("没找到记录")return}fmt.Println(result.Error)return}fmt.Println(result.RowsAffected)for i, work := range works {fmt.Println(i, work)}

3、根据指定字段查询

	// 指定结构体查询字段var work2 []Workresult11 := db.Select("name,age").Where("age = ?", 20).Limit(2).Find(&work2)if result.Error != nil {if errors.Is(result11.Error, gorm.ErrRecordNotFound) {fmt.Println("没找到记录")return}fmt.Println(result11.Error)return}fmt.Println(result11.RowsAffected)for i, work := range work2 {fmt.Println(i, work)}

四、更新

1、Save() 保存多个字段

Save 会保存所有的字段,即使字段是零值

保存 是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 Update (包含所有字段)。

	works := []Work{{User: User{Name: "张三", Age: 18}, Work: "程序员"},{User: User{Name: "李四", Age: 19}, Work: "程序员"},{User: User{Name: "王五", Age: 20}, Work: "程序员"},}result := db.Save(works)if result.Error != nil && result.RowsAffected == 0 {fmt.Println("保存失败")return}fmt.Println("保存成功")

2、更新单个字段

可以使用主键查询也可以是使用某个特定的字段查询,也可以同时使用查询。

	// 根据表的name进行修改信息result := db.Model(&Work{}).Where("name=?", "张三").Updates(map[string]interface{}{"age": 112, "work": "大佬"})if result.Error != nil {panic(result.Error)}if result.RowsAffected == 0 {panic("没有更新数据")}fmt.Println(result.RowsAffected)// 根据id修改信息var w Workw.ID = 1result = db.Model(&w).Updates(map[string]interface{}{"age": 32, "work": "行长"})if result.Error != nil {panic(result.Error)}if result.RowsAffected == 0 {panic("没有更新数据")}fmt.Println(result.RowsAffected)

五、删除

如果你的模型包含了 gorm.DeletedAt字段(该字段也被包含在gorm.Model中),那么该模型将会自动获得软删除的能力!

当调用Delete时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt设置为当前时间,而后的一般查询方法将无法查找到此条记录。

软删除:

	// 根据主键删除var w Workw.ID = 7// db.Delete(&Work{}, 8) //一样的result := db.Where("age < ?", 98).Delete(&w)if result.Error != nil {panic(result.Error)}if result.RowsAffected == 0 {panic("没有删除任何数据")}fmt.Println(result.RowsAffected)

物理删除:

// 物理删除主键为 5 6的两条信息
db.Unscoped().Delete(&Work{}, 5, 6)

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

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

相关文章

Ubuntu18.04设置SSH密钥登录

我们一般使用 VSCode 、MobaXterm、PuTTY等 SSH 客户端来远程管理 Linux 服务器。但是&#xff0c;一般的密码方式登录&#xff0c;容易有密码被暴力破解的问题。所以&#xff0c;一般我们会将 SSH 的端口设置为默认的 22 以外的端口&#xff0c;或者禁用 root 账户登录。但是即…

Mybatis-Plus快速上手

依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency> <dependency><groupId>mysql</groupId><artifactId&g…

Go语言fmt包深度探索:格式化输入输出的利器

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3ad; 引言一、基础输出函数fmt.Print与fmt.Println&#x1f4cc; fmt.Print&#xff1a;纯粹输出&#xff0c;不带换行&#x1f4cc; fmt.Println&#xff1a;输出后自动添加换行符 二、格式化输出fmt.Printf&…

unity华为sdk接入指路指南

目前比较靠谱的几个方案&#xff1a;试过几个仅供参考 温馨提示&#xff1a;最高目前可支持方案到unity2021版本以下&#xff0c;以上请联系华为官方寻求技术支持 Unity集成华为游戏服务SDK方式&#xff08;一&#xff09;&#xff1a;集成Unity官方游戏SDK&#xff1a; 华为…

深入剖析Spring框架:推断构造方法与@Bean注解的内部机制

你好&#xff0c;我是柳岸花开。 Spring框架作为Java开发中广泛使用的基础架构&#xff0c;其设计精巧、功能强大&#xff0c;尤其是其依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IoC&#xff09;特性&#xff0c;极大地提高了代码的可维护性和可测试性。本文将…

OS复习笔记ch5-2

引言 在上一篇笔记中&#xff0c;我们介绍到了进程同步和进程互斥&#xff0c;以及用硬件层面上的三种方法分别实现进程互斥。其实&#xff0c;软件层面上也有四种方法&#xff0c;但是这些方法大部分都存在着一些问题&#xff1a; “上锁”与“检查”是非原子操作&#xff0…

基于Springboot+Vue的Java项目-旅游网站系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

Meta最新研究: Flash Attention 为何是系统性能瓶颈?

I. 引言 随着机器学习趋向于更大和更复杂的模型,模型训练过程变得越来越计算和资源密集。生成式AI的出现进一步推动了模型开发的边界,大型语言模型(LLMs)通常在数百或数千个GPU上训练数月。以LLaMA2的70-B参数模型为例,需要1,720,320 GPU小时来训练。对于如此长的训练作业,训练…

高项第四版 十大管理及49个过程【背】作业分享

项目管理 1.十大管理【背】 包括&#xff08;口诀:范进整狗子&#xff08;沟质&#xff09; 才&#xff08;采&#xff09;干成疯子&#xff08;风资&#xff09;&#xff09;: &#xff08;1&#xff09;项目整合管理:识别、定义、组合、统一和协调各项目管理过程组的各个过…

了解外汇震荡类货币对特征与交易策略

外汇市场是全球最大的金融市场&#xff0c;每天的交易量超过6万亿美元。在这个市场上&#xff0c;货币对之间的价格变动反映了全球经济和政治动态。外汇货币对通常被分为三类&#xff1a;主要货币对、次要货币对和外来货币对。而在交易这些货币对时&#xff0c;市场表现通常分为…

自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录 一、inventory 主机清单 1.1inventory 中的变量 1.1.1主机变量 1.1.2组变量 1.1.3组嵌套 二、Ansible 的脚本 ------ playbook&#xff08;剧本&#xff09; 2.1 playbook介绍 2.2playbook格式 2.3playbooks 的组成 2.4playbook编写 2.5运行playbook 2.5.1ans…

RabbitMQ的介绍和使用

1.同步通讯和异步通讯 举个例子&#xff0c;同步通讯就像是在打电话&#xff0c;因此它时效性较强&#xff0c;可以立即得到结果&#xff0c;但如果你正在和一个MM打电话&#xff0c;其他MM找你的话&#xff0c;你们之间是不能进行消息的传递和响应的 异步通讯就像是微信&#…