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.mzph.cn/news/833406.shtml

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

相关文章

Python中设计注册登录代码

import hashlib import json import os import sys # user interface 用户是界面 UI """ 用户登录系统 1.注册 2.登陆 0.退出 """ # 读取users.bin def load(path): return json.load(open(path, "rt")) # 保存user.bin def save(dic…

Figma 高效技巧:设计系统中的图标嵌套

Figma 高效技巧&#xff1a;设计系统中的图标嵌套 在设计中&#xff0c;图标起着不可或缺的作用。一套便捷易用的图标嵌套方法可以有效提高设计效率。 分享一下我在图标嵌套上走过的弯路和经验教训。我的图标嵌套可以分三个阶段&#xff1a; 第一阶段&#xff1a;建立图标库 一…

目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…

【unity】(2)GameObject

GameObject类是基本的游戏对象类型&#xff0c;它可以用来代表场景中的任何实体。 基本属性 name 类型&#xff1a;string说明&#xff1a;GameObject的名称。用法&#xff1a; GameObject go new GameObject(); go.name "My GameObject";activeSelf 类型&#xf…

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM&#xff08;一系列专为高效设备上处理而设计的开源语言模型&#xff09;引发了相当大的争论。一方面&#xff0c;苹果在开源协作和设备端AI处理方面迈出了一步&#xff0c;强调隐私和效率。另一方面&#xff0c;与微软 Phi-3 Mini 等竞争对手相比&#xf…

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …

【Node.js】使用 PostgreSQL、Sequelize 和 Express.js 进行 Node.js 认证

使用 PostgreSQL、Sequelize 和 Express.js 进行 Node.js 认证 作者&#xff1a;Racheal Kuranchie 来源&#xff1a;https://medium.com/rachealkuranchie/node-js-authentication-with-postgresql-sequelize-and-express-js-20ae773da4c9 使用 PostgreSQL、Sequelize 和 Expr…

Linux上安装及卸载OpenJDK

Linux上安装Java Development Kit (JDK) 8的步骤如下&#xff1a; 1. 添加Java JDK 8的Yum源 首先&#xff0c;你需要添加Java JDK 8的Yum源到系统。这可以通过下载并安装Oracle JDK的方式完成&#xff0c;但由于Oracle JDK在某些情况下可能需要遵守特定的许可协议&#xff0c…

探索Baidu Comate:编程世界中的新利器

文章目录 Baidu Comate 介绍Baidu Comate的优势Baidu Comate安装过程Baidu Comate实战演练代码调优代码解释代码生成注释生成 总结 Baidu Comate 介绍 随着GPT的大火&#xff0c;衍生了各种AI工具&#xff0c;这些AI工具遍布在各行业各领域中&#xff0c;有AI写作、AI办公、AI…

[力扣题解] 216. 组合总和 III

题目&#xff1a;216. 组合总和 III 思路 回溯法 代码 class Solution { private:vector<vector<int>> result;vector<int> path;public:void function(int k, int n, int startindex, int sum){int i;// 剪枝// 超过了, 不用找了;if(sum > n){return…

向各位请教一个问题

这是菜鸟上的一道题目&#xff0c;单单拿出来问问大家&#xff0c;看看能不能解惑 &#xff0c;谢谢各位&#xff01; 题目25&#xff1a;求12!3!...20!的和 解题思路&#xff1a;这个题不知道为什么我用DEV C 5.11显示出来为0.000000&#xff0c;可能版本有问题&#xff1f;&a…

linux挂载数据盘详细步骤

在 Linux 上挂载数据盘通常涉及以下步骤&#xff1a; 1. **识别数据盘**&#xff1a;首先&#xff0c;你需要找到要挂载的磁盘设备。在命令行中使用 lsblk 或 fdisk -l 命令查看系统中的磁盘和分区。你会看到类似 sda, sdb, sdc 这样的设备名称&#xff0c;以及各自的分区。 l…

jenkins部署服务到windows系统服务器

1、安装openSSH windows默认不支持ssh协议&#xff0c;需要下载安装&#xff0c;主要适用于jenkins传输文件已经执行命令使用 点击查看下载openSSH 2、项目配置 这里简单说说怎么配置&#xff0c;主要解决点就是ssh执行cmd或shell命令时不能开启新窗口导致应用部署失败或者断…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

阿里/腾讯/华为云国际使用须知

一&#xff1a;针对国内客户业务&#xff1a;务必限制国内IP的访问。建议客户使用代理进行访问&#xff0c;或者考虑使用第三方CDN服务来屏蔽腾讯云国际服务器的IP或域名&#xff0c;以降低客户投诉和风控服务器风险。 二&#xff1a;对于国外客户业务&#xff1a;务必设置禁止…

【spark实战:报错】spark序列化报错:Kryo serialization failed: Buffer overflow

文章目录 spark序列化报错问题解决 spark序列化报错 org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 61186304. To avoid this, increase spark.kryoserializer.buffer.max value.at org.apache.spark.serializer.Kry…

第 7 章 MyBatis 缓存配置

第 7 章 MyBatis 缓存配置 一. 一级缓存1. 代码讲解一级缓存2. 关闭一级缓存的方法二. 二级缓存1. 介绍2. 配置二级缓存2.1 开启二级缓存全局配置2.2 两种配置方法2.3 mapper.xml中配置二级缓存 ❤❤❤默认配置配置参数讲解2.4 Mapper 接口中配置二级缓存❤❤❤2.5 同时使用时注…

海云安受邀参加诸子云 4.27南京「金融互联网」私董会

4月27日&#xff0c;“安在新媒体网安用户行业活动”第四期私董会在南京顺利举办。活动以“金融&互联网”为主题&#xff0c;邀请十余位业内资深的甲方用户以及典型厂商代表。摒弃传统的议题分享&#xff0c;采取“随时问答&#xff0c;自由讨论”的形式&#xff0c;提问题…

Poisson_Image-Editing

1.算法介绍 快速泊松图像编辑&#xff08;Fast Poisson Image Editing&#xff09;是一种图像处理算法&#xff0c;用于将源图像的某个区域无缝地嵌入到目标图像中。它基于泊松方程的性质&#xff0c;通过求解离散化的泊松方程来实现图像的融合。该算法的核心思想是&#xff0c…

Shell 初始化配置指北 | Ubuntu

唠唠闲话 概要&#xff1a;在不同的Shell环境&#xff08;如Bash和Zsh&#xff09;中设置环境变量、设置初始脚本&#xff0c;以及如何根据不同的使用场景&#xff08;用户级或系统级&#xff09;管理和设置初始运行命令。 p.s. 如果你很熟悉 Linux&#xff0c;推荐跳到最后一…