15分钟学 Go 第 40 天:使用ORM库

第40天:使用ORM库

1. 课程目标
  • 理解ORM的概念和优势。
  • 学习Go语言中常用的ORM库。
  • 掌握如何使用ORM进行基本的CRUD操作。
  • 理解ORM与数据库之间的映射关系。

2. 什么是ORM?

ORM,或对象关系映射,是一种技术,旨在将对象编程语言中的对象与数据库中的数据表进行映射。ORM的主要目标是简化与数据库的交互,使开发者能够在代码中使用对象而不是SQL语言来进行数据库操作。

ORM的优点:

  • 简化代码:ORM使得数据库交互变得更简单,减少了复杂的SQL查询。
  • 类型安全:通过编译时检查来确保类型安全。
  • 跨数据库兼容性:大多数ORM框架提供对多种数据库的支持,降低了迁移成本。

3. Go语言中的常用ORM库
库名描述官方文档
GORM最流行的Go语言ORM库,功能强大,易于使用。GORM
Beego ORMBeego框架内置的ORM库,简单易用。Beego ORM
ent强类型ORM,生成代码的灵活性高。ent
sqlx扩展了database/sql,可以简化SQL查询。sqlx

本节内容将使用GORM进行演示


4. 安装GORM

首先,我们需要安装GORM库。在终端中运行以下命令:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite  # 这里使用SQLite作为示例数据库

5. GORM基础知识

在GORM中,我们通常使用结构体定义模型。GORM会根据结构体的字段名及标签生成相应的数据库表。

示例代码:

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
)

// 定义模型
type User struct {
    ID       uint   `gorm:"primaryKey"`
    Name     string `gorm:"size:100"`
    Age      uint
    Email    string `gorm:"uniqueIndex"`
}

func main() {
    // 连接数据库
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        log.Fatal(err)
    }

    // 自动迁移
    db.AutoMigrate(&User{})
}

代码解释:

  • 我们定义了一个User结构体,包含ID, Name, AgeEmail字段。
  • 使用gorm:"primaryKey"标签定义ID为主键,gorm:"uniqueIndex"确保Email是唯一的。
  • 通过gorm.Open连接到SQLite数据库,并使用AutoMigrate创建数据表。

6. CRUD操作

在GORM中,您可以通过方法链实现CRUD(创建、读取、更新、删除)操作。

6.1 创建

user := User{Name: "John Doe", Age: 30, Email: "john@example.com"}
result := db.Create(&user) // 创建记录
if result.Error != nil {
    log.Fatal(result.Error)
}

6.2 读取

var users []User
db.Find(&users) // 查询所有用户
log.Println(users)

var user User
db.First(&user, 1) // 查询ID为1的用户
log.Println(user)

6.3 更新

db.Model(&user).Update("Age", 31) // 更新用户年龄

6.4 删除

db.Delete(&user, 1) // 删除ID为1的用户

7. 代码运行流程图

下面是代码运行的流程图,展示了通过GORM与数据库的交互过程。

Create
Read
Update
Delete
Start
Connect to Database
Define Model
AutoMigrate
Choose Action
Create User
Query Users
Update User
Delete User
End

8. 事务处理

GORM还支持事务处理,确保一组操作要么全部成功,要么全部失败。

示例代码:

func createUser(db *gorm.DB) error {
    return db.Transaction(func(tx *gorm.DB) error {
        user := User{Name: "Alice", Age: 25, Email: "alice@example.com"}
        if err := tx.Create(&user).Error; err != nil {
            return err
        }
        // 其他数据库操作
        return nil
    })
}

9. 高级特性

9.1 关联

GORM支持一对多和多对多关系,通过定义关联结构体来实现。

type Order struct {
    ID     uint
    UserID uint
    Amount float64
}

type UserWithOrders struct {
    User   User
    Orders []Order
}

// 创建用户及其订单
func createUserWithOrders(db *gorm.DB) {
    user := User{Name: "Bob", Age: 28, Email: "bob@example.com"}
    orders := []Order{
        {Amount: 100.0},
        {Amount: 200.0},
    }
    
    user.Orders = orders
    db.Create(&user)
}

9.2 预加载

预加载允许您在查询时自动加载相关数据,避免N+1查询问题。

var usersWithOrders []UserWithOrders
db.Preload("Orders").Find(&usersWithOrders)

10. 性能优化

使用ORM时也要注意性能,可以通过以下方式进行优化:

  • 使用Select限制查询的字段。
  • 针对大型数据集使用LimitOffset进行分页。
  • 适当使用Transaction进行批量操作。

示例代码:

// 查询ID大于5的用户,并只选择Name和Email字段
var users []User
db.Select("Name, Email").Where("ID > ?", 5).Find(&users)

11. 注意事项
  • 确保在结构体中正确使用标签,避免字段映射错误。
  • 定期检查数据库结构与模型的同步。
  • 注意大数据量操作时的性能,合理使用批量处理。

12. 小结

今天我们对Go语言中的ORM库进行了深入的探讨,学习了如何使用GORM进行基本的CRUD操作并了解了高级特性如关联和事务处理。ORM是提升开发效率的重要工具,合理使用可以帮助您构建高效的数据库应用。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 存储机制

一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘,非持久化的消息一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间。这两种类型的消息的落盘处理都…

Kafka自动生产消息软件(自动化测试Kafka)

点击下载《Kafka服务端(含Zookeeper)一键自启软件》 点击下载《kafka客户端生产者消费者kafka可视化工具(可生产和消费消息)》 点击下载《Kafka自动生产消息软件》 1. 前言 在软件开发过程中,Kafka常被用作消息队列来处理特定的业务功能。为…

C#应用随系统启动 - 开源研究系列文章

上次写过一个随系统启动的例子,不过那个是写到注册表中的,自从更新Windows操作系统后就不好使了,所以就换了个方式,只是将应用的快捷方式添加到操作系统的启动目录里,这样随系统启动。 1、 项目目录; 2、 源…

大语言模型在交通领域的应用分析

大语言模型在交通领域的研究进展 前言: 大语言模型(Large Language Models, LLMs)如 GPT (Generative Pre-trained Transformer) 系列,BERT (Bidirectional Encoder Representations from Transformers) 和其他基于 Transformer …

快速删除iPhone照片:释放你的空间,加速你的手机

随着时间的推移,我们的iPhone往往会积累下大量的照片,这不仅占用了大量的存储空间,还可能影响手机的性能。如果你正寻找一种快速、高效的方法快速删除iPhone照片,以下的策略将会大有帮助。此外,本文还将介绍如何利用Cl…

matlab 质心重合法实现点云配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:2024年11月5日。 一、算法原理 1、原理概述 质心重合法是将源点云 P P P

MySQL数据库中的视图

视图 ​ 本篇将开始介绍有关数据库中视图的相关知识点,其中主要包含视图的基本使用,视图规则和限制。 ​ 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,视图的数据变化会…

软件测试基础:单元测试与集成测试

单元测试的重要性 单元测试是软件开发过程中的必要步骤。它通过针对软件的最小可测试单元进行测试,可以及早发现代码中的逻辑错误和缺陷。根据统计数据显示,单元测试可以在软件开发初期就发现约70%的错误,从而减少了后期修改的成本和时间消耗…

昆仑通态触摸屏-如何完成几个窗口的切换

一、启动窗口 想要哪一个窗口是启动时第一个显示的,就把谁设置为启动窗口就可以。 二、公共窗口 给一个窗口命名为公共窗口 然后选择一个窗口,将他的公共窗口设置为我们刚才命名的那个窗口 三、页面切换 页面切换,是通过在公共窗口内设置按…

修改elementUI等UI组件样式的5种方法总结,哪些情况需要使用/deep/, :deep()等方式来穿透方法大全

文章目录 方法 1:全局修改样式示例:修改 `ElMessage` 的背景色和字体颜色方法 2:修改特定类型的 `ElMessage` 样式-全局-不需要穿透示例:修改 `ElMessage` 成功类型的样式方法 3:通过 Scoped CSS 在组件内部修改-局部-不需要穿透方法 4:使用 JavaScript 动态修改样式-不需…

SpringBoot中使用SpringTask实现定时任务

SpringBoot默认在无任何第三方依赖的情况下使用spring-context模块下提供的定时任务工具SpringTask。我们只需要使用EnableScheduling注解就可以开启相关的定时任务功能。 定义一个SpringBean,然后定义具体的定时任务逻辑方法并使用Scheduled注解标记该方法即可。…

CTF中的phar反序列化 [SWPU 2018]SimplePHP

以[SWPU 2018]SimplePHP 这道题为例 页面可以查看文件和上传文件 点击查看文件,发现url变成/file.php?file 猜测可能存在文件包含,可以读取文件 尝试读取index.php文件 回显了源码 再读取base.php 只看最后有信息的代码: <!--flag is in f1ag.php--> 提示flag在f1…

车载通信架构 --- PNC、UB与信号的关系

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

C++进阶-->红黑树的实现

1、红黑树的概念 红黑树是一棵二叉搜索树&#xff0c;他和前面AVL树不同的是红黑树不是通过平衡因子来保证树的平衡&#xff0c;而是在树结点的处加多了个记录颜色的变量&#xff0c;这个变量可以是红色或者黑色。通过对任何一条从根到叶子的路径上各个结点的颜色进行约束&…

微信公众号绑定设计-WeChat public platform bing and send message

一 WeChat bind ui 二、message style 三、 consume style 四、send log 五、temp setting

Linux多线程(个人笔记)

Linux多线程 1.Linux线程概念1.1线程的优点1.2线程的缺点 2.Linux线程VS进程3.Linux线程控制3.1创建线程3.2线程tid及进程地址空间布局3.3线程终止3.4线程等待 4.分离线程5.线程互斥5.1互斥锁mutex5.2互斥锁接口5.3互斥锁实现原理5.4可重入VS线程安全 6.线程同步6.1条件变量6.2…

Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着医疗行业的快速发展和人们对健康需…

LDO电路分析

一、LDO概述 在电压转换电路中&#xff0c;LDO和DC-DC电路是最常用的两种方式&#xff0c;本篇主要介绍LDO相关内容。 LDO是线性电源的一种&#xff0c;它可以实现电源电压的转换&#xff0c;不过主要用在降压领域。它的全称是Low Dropout Regulaor&#xff0c;就是低压差线性…

VirtualBox虚拟机扩容详解

VirtualBox虚拟机扩容详解 virtualbox 扩容找到虚拟机需要扩容的磁盘更改虚拟磁盘的大小 逻辑卷扩容1. 扩展物理卷2. 扩展逻辑卷3. 扩展文件系统 Ubuntu系统安转 minikube 集群后&#xff0c;提示文件系统要炸了&#xff0c;效果如下&#xff1a;可以明显看到 /dev/mapper/ubu…

第02章 MySQL环境搭建

一、MySQL的卸载 如果安装mysql时出现问题&#xff0c;则需要将mysql卸载干净再重新安装。如果卸载不干净&#xff0c;仍然会报错安装不成功。 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0…