当前位置: 首页 > news >正文

GORM:优雅的Go语言ORM库

文章目录

    • 引言
    • GORM原理
    • 基础使用
      • 安装GORM
      • 定义模型
      • 连接数据库
      • CRUD操作
    • 高级使用
      • 关联
      • 事务
      • 回调
    • 优点
    • 结论

引言

在Go语言开发中,数据库操作是不可或缺的一部分。虽然直接使用SQL语句可以灵活地与数据库交互,但随着项目规模的扩大,SQL语句的编写、维护和优化会变得日益复杂。为了简化数据库操作,提高开发效率,ORM(Object-Relational Mapping)框架应运而生。GORM是一个流行的Go语言ORM库,它提供了简洁的API,使得开发者能够以对象的方式操作数据库,而无需编写大量的SQL语句。

GORM原理

GORM通过定义模型(Model)来映射数据库中的表,模型中的字段映射到表的列。在GORM中,你可以通过调用模型的方法来实现增删改查(CRUD)操作,而无需直接编写SQL语句。GORM内部会将这些方法调用转换为相应的SQL语句,并执行它们。此外,GORM还支持事务、预加载、回调等多种高级功能,以满足复杂的数据库操作需求。

基础使用

安装GORM

首先,你需要在你的Go项目中安装GORM。通过以下命令进行安装:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite # 以SQLite为例,根据需要选择其他数据库驱动

定义模型

定义一个模型,映射到数据库中的表。例如,定义一个User模型:

package mainimport ("gorm.io/gorm"
)type User struct {gorm.ModelName  stringEmail string
}

连接数据库

使用GORM连接数据库:

package mainimport ("gorm.io/driver/sqlite""gorm.io/gorm""log"
)func main() {db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})if err != nil {log.Fatal("failed to connect database")}// 接下来可以使用db变量进行数据库操作
}

CRUD操作

以下是一个简单的CRUD操作示例:

func main() {// ... 连接数据库的代码 ...// 创建db.Create(&User{Name: "John Doe", Email: "john@example.com"})// 读取var user Userdb.First(&user, 1) // 根据整型主键查找// 更新 - 更新user的Emaildb.Model(&user).Update("Email", "john.doe@example.com")// 删除db.Delete(&user, 1)
}

高级使用

关联

GORM支持多种关联映射,如一对一、一对多、多对多等。以下是一对多关联的示例:

type Profile struct {gorm.ModelUserID uint// 其他字段...
}func (u *User) Profiles() (profiles []Profile) {db.Model(u).Order("id").Find(&profiles)return
}

事务

使用事务确保数据的一致性:

db.Transaction(func(tx *gorm.DB) error {// 在事务中执行数据库操作if err := tx.Create(&User{Name: "Lili", Age: 20}).Error; err != nil {return err}if err := tx.Create(&User{Name: "Lula", Age: 22}).Error; err != nil {return err}// 提交事务return nil
})

回调

GORM支持在CRUD操作前后执行自定义的回调函数,以实现如日志记录、数据验证等功能:

db.Callback().Create().Before("gorm:create").Register("my_plugin_before_create", myFunc)

优点

  • 简洁的API:GORM提供了简洁易懂的API,使得数据库操作更加直观。
  • 丰富的功能:支持事务、关联、回调等多种高级功能,满足复杂的数据库操作需求。
  • 灵活的配置:可以通过配置选项来定制GORM的行为,如日志级别、数据库连接池大小等。
  • 良好的文档和社区支持:GORM拥有完善的文档和活跃的社区,开发者可以轻松找到解决方案。

结论

GORM作为Go语言中的一款优秀ORM库,以其简洁的API、丰富的功能、灵活的配置和良好的文档支持,赢得了广大开发者的青睐。它极大地简化了数据库操作,使得开发者能够更专注于业务逻辑的实现,而不是陷入繁琐的SQL语句编写中。然而,值得注意的是,虽然GORM提供了诸多便利,但在某些高性能要求的场景下,直接使用原生SQL或结合ORM和原生SQL的方式可能会更加高效。因此,在选择是否使用GORM时,需要根据项目的实际需求进行权衡。总体来说,GORM是一款值得推荐的Go语言ORM库,它能够在大多数场景下提供高效、便捷的数据库操作体验。

相关文章:

GORM:优雅的Go语言ORM库

文章目录 引言GORM原理基础使用安装GORM定义模型连接数据库CRUD操作 高级使用关联事务回调 优点结论 引言 在Go语言开发中,数据库操作是不可或缺的一部分。虽然直接使用SQL语句可以灵活地与数据库交互,但随着项目规模的扩大,SQL语句的编写、…...

Golang | Leetcode Golang题解之第279题完全平方数

题目: 题解: // 判断是否为完全平方数 func isPerfectSquare(x int) bool {y : int(math.Sqrt(float64(x)))return y*y x }// 判断是否能表示为 4^k*(8m7) func checkAnswer4(x int) bool {for x%4 0 {x / 4}return x%8 7 }func numSquares(n int) i…...

Oracle系统表空间的加解密

实验环境 数据库选择的是orclpdb1,当前系统表空间未加密: SQL> show con_nameCON_NAME ------------------------------ ORCLPDB1SQL> select TABLESPACE_NAME, STATUS, ENCRYPTED from dba_tablespaces;TABLESPACE_NAME STATUS …...

pytorch backbone

1 简介 在PyTorch深度学习中,预训练backbone(骨干网络)是一个常见的做法,特别是在处理图像识别、目标检测、图像分割等任务时。预训练backbone通常是指在大型数据集(如ImageNet)上预先训练好的卷积神经网络…...

uniapp 开发app使用renderjs操作dom

需求:把页面中的对话内容另存为一张图片保存到手机相册。 解决方案:这时我们需要使用到document对象创建一个dom对象计算对话内容的宽高、位置等,再利用canvas能力将内容绘制绘制成一张图保存。 现状:总所周知,非H5端&…...

【面试题】MySQL `EXPLAIN`的`Extra`字段:深入解析查询优化的隐藏信息

MySQL EXPLAIN的Extra字段:深入解析查询优化的隐藏信息 引言 在MySQL的EXPLAIN输出中,Extra字段提供了关于查询执行计划的额外信息。这些信息对于理解查询的内部工作机制和优化查询性能至关重要。本文将详细解析Extra字段中常见的几个关键指标&#xf…...

Jenkins持续部署

开发环境任务的代码只要有更新,Jenkins会自动获取新的代码并运行 1. pycharm和git本地集成 获取到下面的 Git可执行文件路径 2. pycharm和gitee远程仓库集成 先在pycharm中安装gitee插件 在设置中找到gitee,点击添加账户,并将自己的账户添…...

橙单前端项目下载编译遇到的问题与解决

今天下载orange-admin前端项目,不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误,如下: 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了,可能是原作者…...

在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url

在 Android 中实现从包含图片 ID 的列表获取实际图片 URL 并显示图片,你可以使用以下步骤: 定义数据模型:创建一个 Java 或 Kotlin 类来表示列表中的对象。 网络请求:使用 Retrofit 或其他网络库来获取图片 URL。 异步处理:使用 AsyncTask、RxJava 或 Kotlin 协程来处理网…...

IM聊天代码

客户端 Headers inet inet.h #pragma once #include<Winsock2.h>//#pragma comment(lib,"Ws2_32.lib")class INetMediator; class INet { public:INet(){}virtual ~INet(){}//初始化网络virtual bool initNet() 0;//接收数据virtual void recvData() 0;…...

【Go - context 速览,场景与用法】

作用 context字面意思上下文&#xff0c;用于关联管理上下文&#xff0c;具体有如下几个作用 取消信号传递&#xff1a;可以用来传递取消信号&#xff0c;让一个正在执行的函数知道它应该提前终止。超时控制&#xff1a;可以设定一个超时时间&#xff0c;自动取消超过执行时间…...

Linus: vim编辑器的使用,快捷键及配置等周边知识详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 vim的安装创建新用户 adduser 用户名Linus是个多用户的操作系统是否有创建用户的权限查看当前用户身份:whoami** 怎么创建设置密码passwdsudo提权(sudo输入的是用户…...

数仓作业延时告警-基于关键路径预推

简介 作业延时告警&#xff0c;通常来说有两种方式&#xff1a; 其一&#xff0c;当作业到目标时间点还没完成触发告警&#xff1b;这类情况&#xff0c;对于目标作业而言&#xff0c;延时已经触发了&#xff0c;风险相对较大&#xff1b;有的是监控接口延时&#xff08;raw层…...

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…...

麒麟桌面操作系统上配置Samba

原文链接&#xff1a;麒麟桌面操作系统上配置Samba Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在麒麟桌面操作系统上配置Samba的文章。Samba是一种免费的软件&#xff0c;实现了SMB/CIFS网络协议&#xff0c;使得Linux和Windows系统之间可以共享文件和打印机…...

【Go】探索 Go 语言的内建函数 copy

山水间歌声回荡 回荡思念的滚烫 去年的家书两行 读来又热了眼眶 云水边静沐暖阳 烟波里久违的故乡 别来无恙 你在心上 &#x1f3b5; 张靓颖/张杰《燕归巢》 在 Go 语言中&#xff0c;copy 是一个用于在切片之间复制元素的内建函数。它提供了一种简单而高…...

【React】JSX:从基础语法到高级用法的深入解析

文章目录 一、什么是 JSX&#xff1f;1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…...

JMeter 使用

1.JMeter 是什么&#xff1f; JMeter 是一款广泛使用的开源性能测试工具&#xff0c;由 Apache 软件基金会维护。它主要用于测试 Web 应用程序的负载能力和性能&#xff0c;但也支持其他类型的测试&#xff0c;如数据库、FTP、JMS、LDAP、SOAP web services 等。 2.特点&#x…...

20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea

备注参考博客&#xff1a; 1&#xff09;可以参考博客&#xff0c;用git把项目git到本地 2&#xff09;可以参考博客vcs没有git 3)git版本更新&#xff0c;覆盖安装 &#xff08;一&#xff09;安装git &#xff08;1&#xff09;官网下载的链接 https://git-scm.com/downlo…...

JavaScript实战 - 用Canvas画一个心形

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问或建议&#xff0c;请私信或评论留言&#xff01; 前言&#xff1a; 如…...

Unity3D游戏马赛克清除终极指南:7种高效技术深度解析

Unity3D游戏马赛克清除终极指南&#xff1a;7种高效技术深度解析 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics …...

百度网盘macOS下载限速破解:3步实现高速下载的完整指南

百度网盘macOS下载限速破解&#xff1a;3步实现高速下载的完整指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘在macOS上的龟速下载…...

Network-AI:解决多智能体协作竞态与状态冲突的协调层

1. 项目概述&#xff1a;Network-AI&#xff0c;一个解决多智能体“内讧”的协调器如果你正在用LangChain、CrewAI或者AutoGen构建AI智能体应用&#xff0c;大概率遇到过这样的场景&#xff1a;你部署了两个智能体&#xff0c;一个负责分析数据&#xff0c;一个负责生成报告。它…...

白起、项羽、黄巢杀降时的第三选择

白起、项羽、黄巢&#xff0c;他们都曾站在“杀降”这个决策悬崖上。与其说这是他们个人的暴虐&#xff0c;不如说他们当时都陷入了一个由战争逻辑、资源短缺和恐惧心理共同构筑的绝境。在那个系统里&#xff0c;他们几乎无法做出别的选择。&#x1f3b2; 那场被逼到墙角的困兽…...

从原理到实践:InSAR技术如何重塑地表形变监测

1. 从雷达信号到毫米级形变&#xff1a;InSAR技术原理揭秘 想象一下&#xff0c;你站在湖边向平静的水面扔一块石头&#xff0c;水波会以同心圆的形式向外扩散。如果这时有人在水面另一处也扔了一块石头&#xff0c;两列水波相遇时就会产生干涉现象——有的地方波峰叠加变得更高…...

AI推理冷启动归零实践,奇点大会实测数据:基于WASM+eBPF的Serverless边缘推理框架将P99延迟压至17ms,附开源代码仓链接

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生Serverless实践&#xff1a;2026奇点智能技术大会无服务器架构 在2026奇点智能技术大会上&#xff0c;AI原生Serverless成为核心范式——它不再将模型推理简单托管于函数即服务&#xff08;FaaS&…...

实测好用、真正免费(无水印/无强制付费) 的剪辑软件合集来啦

剪辑小白看过来&#xff01;2026年实测好用、真正免费&#xff08;无水印/无强制付费&#xff09; 的剪辑软件合集来啦&#xff01;????不管你是学生党、自媒体新人&#xff0c;还是电脑配置不高&#xff0c;这篇笔记帮你按设备&#xff08;手机/电脑/网页&#xff09; 精准…...

硬件工程师的办公室布局与效率系统:从工具管理到创意激发

1. 我的“极乐之穹”&#xff1a;一个硬件工程师的办公室漫游每次在博客里提到“极乐之穹”&#xff0c;指的都是我的办公室。偶尔&#xff0c;我也会聊起在四处搜罗时遇到并收入囊中的那些令人心动的电子设备或“艺术品”。时间久了&#xff0c;总有人让我拍点照片分享。问题在…...

秋招编程面试,应届生必备的面试技巧,通过率直接翻倍

文章目录前言一、2026秋招编程面试新趋势&#xff1a;别再用老方法准备&#xff0c;踩坑就出局1.1 八股文不再是核心&#xff0c;底层理解才是硬通货1.2 代码手撕重思路轻结果&#xff0c;工程思维成加分项1.3 项目经历拒绝烂大街&#xff0c;真实落地细节把控是关键二、简历优…...

硬件工程师必读:九大核心算法如何重塑芯片与系统设计

1. 项目概述&#xff1a;一次关于算法之美的深度阅读作为一名在电子工程和数字设计领域摸爬滚打了十几年的工程师&#xff0c;我的日常工作就是和FPGA、ASIC、各种EDA工具以及层出不穷的硬件描述语言打交道。我们这行&#xff0c;天天谈的是时序收敛、功耗优化、面积利用&#…...