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…

Apple OpenELM设备端语言模型

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

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

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

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

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

向各位请教一个问题

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

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;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

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

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

Poisson_Image-Editing

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

信息系统项目管理师0092:项目管理原则(6项目管理概论—6.4价值驱动的项目管理知识体系—6.4.1项目管理原则)

点击查看专栏目录 文章目录 6.4价值驱动的项目管理知识体系6.4.1项目管理原则1.原则一:勤勉、尊重和关心他人2.原则二:营造协作的项目管理团队环境3.原则三:促进干系人有效参与4.原则四:聚焦于价值5.原则五:识别、评估和响应系统交互6.原则六:展现领导力行为7.原则七:根…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP&#xff08;动态主机配置协议&#xff09;2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、Mac地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT&#xff08;Netwo…

沙盘Sandboxie v5.56.4

菜鸟高手裸奔工具沙盘Sandboxie是一款国外著名的系统安全工具&#xff0c;它可以让选定程序在安全的隔离环境下运行&#xff0c; 只要在此环境中运行的软件&#xff0c;浏览器或注册表信息等都可以完整的进行清空&#xff0c;不留一点痕迹。同时可以防御些 带有木马或者病毒的…

OpenHarmony usb打开报错“usb fail error code = -3, error msg = LIBUSB_ERROR_ACCESS”

一、前言&#xff1a;最近公司项目需求&#xff0c;定位要求使用国产系统&#xff0c;国产系统无非就是 统信os &#xff0c;麒麟OS, 还有这两年比较热的 OpenHarmony。于是&#xff0c;老板要求公司产品适配OpenHarmony , 跟上时代步伐。 二、在开发中使用 usb 通讯时&#x…

Unity射击游戏开发教程:(12)使用后处理

后处理 后期处理是向您的游戏场景添加一个或多个滤镜,确实可以为您的游戏提供精美的外观。在本文中,我们将讨论如何在 Unity 中设置后处理系统,从那里您可以探索和试验 Unity 提供的所有过滤器。 首先,我们需要从包管理器添加后处理器堆栈。包管理器是 Unity 产品的集合,…

淘宝数据分析——Python爬虫模式♥

大数据时代&#xff0c; 数据收集不仅是科学研究的基石&#xff0c; 更是企业决策的关键。 然而&#xff0c;如何高效地收集数据 成了摆在我们面前的一项重要任务。 本文将为你揭示&#xff0c; 一系列实时数据采集方法&#xff0c; 助你在信息洪流中&#xff0c; 找到…

怎么在家访问公司内网?

在当前的疫情情况下&#xff0c;越来越多的公司开始允许员工在家办公&#xff0c;这就需要解决一个问题&#xff1a;如何在家访问公司的内网资源呢&#xff1f;今天我将介绍一种解决方案——使用【天联】组网&#xff0c;它具有许多优势。 【天联】组网的优势 无网络限制&#…

在Node.js(express 框架)中使用 JWT 进行身份认证

文章目录 一、JWT 认证机制二、安装 JWT 相关的包三、基本使用1、生成 JWT 字符串2、添加中间件&#xff0c;解析 JWT 字符串3、获取管理员信息(admin) 一、JWT 认证机制 JWT 认证机制&#xff08;图片来源于网络&#xff0c;侵权删除&#xff09;&#xff1a; 关于 JWT 原理可…

Conda下Richdem包遇到问题

Conda中Richdem包遇到问题 文章目录 Conda中Richdem包遇到问题问题一报错解决 问题二报错解决 参考 问题一 报错 RichDEM 是一套数字高程模型 &#xff08;DEM&#xff09; 水文分析工具&#xff0c;这次打算用richdem进行地形分析&#xff0c;尝试在conda里面安装richdem包的…