GROM快速上手

article/2025/6/14 16:13:50

请添加图片描述

🐾 个人主页 🐾

阿松爱睡觉,横竖醒不来
🏅你可以不屠龙,但不能不磨剑🗡

目录

  • 一、概要
  • 二、上手步骤
    • (一)安装 GORM
    • (二)连接数据库
    • (三)定义模型
    • (四)CRUD 操作示例
      • 1. 创建记录
      • 2. 查询记录
      • 3. 更新记录
      • 4. 删除记录
    • (五)高级功能示例
      • 1. 事务处理
      • 2. 钩子(Hooks)
  • 三、完整示例
  • 四、结语

一、概要

什么是GORM?

GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库、是一个功能强大且易于使用的 ORM 库,用于简化与数据库的交互。

它支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),并提供了丰富的功能,如模型定义、CRUD 操作、事务处理、钩子(Hooks)等。适合在 Go 语言中操作数据库,可通过定义模型、使用 CRUD 操作和事务处理,可以快速构建数据库驱动的应用程序。

二、上手步骤

直接上手!

(一)安装 GORM

首先,使用以下命令安装 GORM 和数据库驱动(以 MySQL 为例):

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

(二)连接数据库

使用 GORM 连接数据库:

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"
)func main() {// 数据库连接信息dsn := "user: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 {panic("failed to connect database")}// 自动迁移(创建表)db.AutoMigrate(&User{})
}

(三)定义模型

定义一个 Go 结构体来表示数据库表:

type User struct {gorm.Model        // 内嵌 gorm.Model,包含 ID、CreatedAt、UpdatedAt、DeletedAt 字段Name       string `gorm:"size:255"` // 用户名Email      string `gorm:"uniqueIndex"` // 邮箱,唯一索引Age        int    // 年龄
}

(四)CRUD 操作示例

1. 创建记录

func createUser(db *gorm.DB) {user := User{Name: "Alice", Email: "alice@example.com", Age: 25}result := db.Create(&user) // 插入数据if result.Error != nil {panic(result.Error)}fmt.Println("User created:", user.ID)
}

2. 查询记录

func findUser(db *gorm.DB) {var user Userresult := db.First(&user, "email = ?", "alice@example.com") // 查询第一条记录if result.Error != nil {panic(result.Error)}fmt.Println("Found user:", user)
}

3. 更新记录

func updateUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com") // 查询用户db.Model(&user).Update("Age", 30) // 更新年龄fmt.Println("Updated user:", user)
}

4. 删除记录

func deleteUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com") // 查询用户db.Delete(&user) // 删除用户fmt.Println("Deleted user:", user)
}

(五)高级功能示例

1. 事务处理

func transactionExample(db *gorm.DB) {tx := db.Begin() // 开始事务defer func() {if r := recover(); r != nil {tx.Rollback() // 回滚事务}}()user1 := User{Name: "Bob", Email: "bob@example.com", Age: 30}if err := tx.Create(&user1).Error; err != nil {tx.Rollback() // 回滚事务panic(err)}user2 := User{Name: "Charlie", Email: "charlie@example.com", Age: 35}if err := tx.Create(&user2).Error; err != nil {tx.Rollback() // 回滚事务panic(err)}tx.Commit() // 提交事务fmt.Println("Transaction completed")
}

2. 钩子(Hooks)

GORM 支持在模型的生命周期中插入钩子函数。例如,在创建记录前自动设置字段:

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {fmt.Println("BeforeCreate hook:", u.Name)return
}

下面列举一下完成的钩子,用法都是一样的:

  • BeforeSave:在保存之前调用,无论是创建还是更新操作。
  • BeforeCreate:在创建之前调用。
  • AfterCreate:在创建之后调用。
  • BeforeUpdate:在更新之前调用。
  • AfterUpdate:在更新之后调用。
  • AfterSave:在保存之后调用,无论是创建还是更新操作。
  • BeforeDelete:在删除之前调用。
  • AfterDelete:在删除之后调用。
  • AfterFind:在查询之后调用,用于单个对象查询。

三、完整示例

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {gorm.ModelName  string `gorm:"size:255"`Email string `gorm:"uniqueIndex"`Age   int
}func main() {dsn := "user: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 {panic("failed to connect database")}db.AutoMigrate(&User{})createUser(db)findUser(db)updateUser(db)deleteUser(db)transactionExample(db)
}func createUser(db *gorm.DB) {user := User{Name: "Alice", Email: "alice@example.com", Age: 25}result := db.Create(&user)if result.Error != nil {panic(result.Error)}fmt.Println("User created:", user.ID)
}func findUser(db *gorm.DB) {var user Userresult := db.First(&user, "email = ?", "alice@example.com")if result.Error != nil {panic(result.Error)}fmt.Println("Found user:", user)
}func updateUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com")db.Model(&user).Update("Age", 30)fmt.Println("Updated user:", user)
}func deleteUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com")db.Delete(&user)fmt.Println("Deleted user:", user)
}func transactionExample(db *gorm.DB) {tx := db.Begin()defer func() {if r := recover(); r != nil {tx.Rollback()}}()user1 := User{Name: "Bob", Email: "bob@example.com", Age: 30}if err := tx.Create(&user1).Error; err != nil {tx.Rollback()panic(err)}user2 := User{Name: "Charlie", Email: "charlie@example.com", Age: 35}if err := tx.Create(&user2).Error; err != nil {tx.Rollback()panic(err)}tx.Commit()fmt.Println("Transaction completed")
}

四、结语

如果逐步看到这里并且同时你已经敲代码进行了实践,那么你可以在项目中进行使用GORM了,恭喜你已经入门初步掌握最基础常用的功能。接下里就是在项目中熟练的使用GROM。

这篇文章就到这里,下期见,拜拜。

请添加图片描述

请添加图片描述


http://www.hkcw.cn/article/rGhJvlZtYU.shtml

相关文章

MATLAB仿真生成无线通信网络拓扑推理数据集

一、数据集生成程序 %创建时间:2025年6月3日 %用途:生成不同节点样本,统计稀疏性约束情况 %zhouzhichaoclose all clearfor n [20,30,40,50]dataset_n 100;nodes_P ones(n,1);for Sampling_M [3000]%获取一帧信号及对应功率[ack,fs] ac…

【OCCT+ImGUI系列】012-Geom2d_AxisPlacement

Geom2d_AxisPlacement 教学笔记 一、类概述 Geom2d_AxisPlacement 表示二维几何空间中的一个坐标轴(轴系),由两部分组成: gp_Pnt2d:原点(Location)gp_Dir2d:单位方向向量&#xff…

NodeMediaEdge任务管理

NodeMediaEdge任务管理 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中,拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 在未使用NodeMediaServer的情况下,或是对部分视频流需要单独推送的需求,也可…

ROS2学习(18)------ROS2 Rviz工具使用说明

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 ROS版本:2 ROS 2 中的 Rviz(Robot Visualization)是一个强大的三维可视化工具,用于显示来自 ROS 系统的各种传感器数据、路径规划结果、机器人…

安科瑞APD300:多模态融合的智能局放监测新标杆

安科瑞顾强 在电网安全运行的严密链条中,开关柜、环网柜等高压设备如同关键节点,其内部绝缘状态的完好性直接决定着电力系统的整体稳定。局部放电(PD)作为绝缘劣化的早期、灵敏征兆,若能及时捕捉和精准识别&#xff0…

Office文档图片批量导出工具

软件介绍 本文介绍一款专业的Office文档图片批量导出工具。 软件特点 这款软件能够批量导出Word、Excel和PPT中的图片,采用绿色单文件设计,体积小巧仅344KB。 基本操作流程 使用方法十分简单:直接将Word、Excel或PPT文件拖入软件&#xf…

网络编程(计算机网络基础)

认识网络 1.网络发展史 ARPnetA(阿帕网)->internet(因特网)->移动互联网->物联网 2.局域网与广域网 局域网 概念:的缩写是LAN(local area network),顾名思义,是个本地的网络,只能实现小范围短距…

godwork_ AT 5.2 摄影测量空三数据处理软件。

1.平差技术,平差模块不依赖PATB、Bingo等国外技术 2.采用特征匹配,对国内无人机数据具有很强的适应性,对测区大小、形状、重叠度没有严格限制,适用于大偏角影像、大高差地区。 3.对飞行方向没有要求,无需旋转影像等预…

《仿盒马》app开发技术分享-- 个人中心关于逻辑完善(端云一体)

开发准备 上一节我们针对首页的一些静态按钮做了一些功能上的完善,这一节我们要针对已有的功能做一下逻辑完善,经过测试,在一开始的登录中我们登录之后当前页面的状态并不能马上的展示出来,并且缺少退出功能,退出后我…

UniRig:如何在矩池云一站式解决 3D 模型绑定难题

在 3D 动画制作中,绑定(Rigging)是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重,以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架,为这一难题提供了全新的解决方案。 什…

二分查找和二分答案(基础)

目录 前言 二分的本质 二分的代码实现 二分查找 题目 洛谷 P1571 眼红的Medusa 洛谷 P1102 A-B 数对 洛谷 P1678 烦恼的高考志愿 OpenJudge 01:查找最接近的元素 二分答案 实现 题目 洛谷 P1824 进击的奶牛 洛谷 P1182 数列分段 Section || 洛谷 P128…

三极管和MOS的三种状态命名的区别

前言 还记得大学用MOS做仿真,来进行原理说明时,总是会将三极管和MOS的叫法搞混。本篇文章就重新回顾,加深下印象。 1. 三极管(BJT)的三个工作状态 BJT 是电流控制型器件,其工作状态由 基极电流 IB​ 和 集…

SKUA-GOCAD入门教程-第八节 线的创建与编辑2

8.1.3根据线创建曲线 (1)从线生成线 这个命令可以将一组曲线合并为一条曲线。每个输入曲线都会成为新曲线内的一个部分。 1、选择 Curve commands > New > Curves 打开对话框。 图1 根据曲线创建曲线 在“name”框中:输入新建线的名称。在“Curves”框中:输入用于…

关于easyx头文件

一、窗口创建 &#xff08;1&#xff09;几种创建方式 #include<easyx.h>//easyx的头文件 #include<iostream> using namespace std;int main() {//创建一个500*500的窗口//参数为&#xff1a;长度&#xff0c;宽度&#xff0c;是否显示黑框&#xff08;无参为不…

基于VLC的Unity视频播放器(四)

上篇文章中提到的问题 播放某个m3u8地址时会嘎掉&#xff0c;想办法解决了一下&#xff0c;很粗暴的&#xff0c;先SetFormat&#xff0c;再Stop&#xff0c;最后再Play&#xff0c;能用…… if (player ! null && player.GetSize() 0) {player.GetSize((w, h) >…

邢台山峰特种橡胶制品有限公司专题报道

在河北任泽经济开发区的现代化厂房里&#xff0c;全自动硫化机正以0.01毫米的精度压制着油封。这里生产的特种橡胶制品&#xff0c;已悄然进入全球90多个国家的工业供应链。作为邢台市橡塑新材料产业集群的企业&#xff0c;邢台山峰特种橡胶制品有限公司用25项专利技术&#xf…

单文件制作工具 7.0.2.3856

【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORkoGbMcUDScW2C5kyqJla8A1?pwdegvq# 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VORkoGbMcUDScW2C5kyqJla8A1?pwdegvq# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1…

打破 GIS 数据处理瓶颈!GISBox 的九种切片方式

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;数据格式的多样性和复杂性一直是制约高效处理与应用的瓶颈。从倾斜摄影模型到BIM设计图纸&#xff0c;从地形影像到点云数据&#xff0c;每一种数据类型都需要精准且高效的切片处理&#xff0c;以实现流畅的三维可视…

Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!

Matlab回归预测大合集又更新啦&#xff01;新增2种高斯过程回归预测模型&#xff0c;已更新41个模型&#xff01;性价比拉满&#xff01; 目录 Matlab回归预测大合集又更新啦&#xff01;新增2种高斯过程回归预测模型&#xff0c;已更新41个模型&#xff01;性价比拉满&#xf…

中英混合编码解码全解析

qwen模型分词器怎么映射的:中英混合编码解码全解析 中英文混合编码与解码的过程,本质是 字符编码标准(如 UTF-8)对多语言字符的统一处理 ,核心逻辑围绕“字节序列 ↔ 字符映射”展开 北京智源人工智能研究院中文tokenID qwen模型分词器文件 一、编码阶段:统一转为字节序…