使用 GORM 实现数据库增删改查操作 | 豆包MarsCode AI刷题

74 阅读7分钟

一、 引言

hey! 你知道Go语言里有很多很棒的 ORM 库吗? 像GORM 这样简单易用、功能丰富又跨平台兼容的工具简直太棒了! 用它就像玩游戏一样轻松搞定数据库操作,是不是很酷?!学习Go ORM或者想快速掌握GORM 进行 CRUD 操作? 那GORM绝对是你的首选! 本文将从数据库连接、数据模型定义到增删改查操作步骤,一步步带你入门GORM,让你快速上手并掌握其核心功能。

二、 项目设置

别急啊!我们使用GORM之前,先把项目做好准备工作吧!就像在搭积木一样,我们需要几个关键步骤: 首先要管理依赖关系,Go 的 go mod 工具就像我们的小助手,它可以帮我们整理项目所需的工具包。 你可以用 go mod init <module_name> 命令来初始化项目模块,然后在 go.mod 文件中添加GORM 和目标数据库驱动作为项目的依赖。比如要使用MySQL数据库的话,就要添加 github.com/jinzhu/gormgithub.com/go-sql-driver/mysql 两个工具包哦!

# 初始化项目
go mod init my-gorm-project

# 添加依赖到 go.mod 文件
module my-gorm-project

go 1.18

require (
        github.com/jinzhu/gorm v1.9.6          // gorm
        github.com/go-sql-driver/mysql v1.8.0  // mysql driver
)

那接下来我们就可以规划一下项目结构了!就像整理房间一样,一个清晰的项目结构能让我们更容易找到东西。 你可以在 main.go 文件中放程序入口, 在 pkg/models.go 文件中定义数据模型, 然后创建一个 config/database.yaml 文件来存放数据库连接信息等等,这样就整齐多了!根据你的需求可以继续划分文件夹,就像搭建一个小房子一样。

my-gorm-project/
├── main.go           // 程序入口
├── pkg/              // 业务逻辑代码
│   └── models.go     // 数据模型定义
└── config/           // 配置文件
    └── database.yaml // 数据库连接配置

可以使用 config/database.yaml 文件来存放数据库连接信息:

driver: mysql
host: localhost
port: 3306
user: root
password: password
dbname: my_database

三、 模型定义

项目基础搭建好之后,现在就该着手定义数据模型了!GORM 为我们提供了一个非常便利的方式来描述数据库表结构。 你可以将 Go 语言的数据类型与数据库字段进行映射,是不是很酷?

  • GORM 的 struct 标签: 每个 Go 结构体代表一个数据库表,而每个结构体的字段对应着数据库表中的列。 通过在字段前添加 gorm 标签,你可以精确地指定字段的名称、数据类型以及其他约束条件。 这就像你为数据库表格设计专属标签一样! 比如想要让姓名 作为唯一索引? 就用 gorm:"unique" 标签标记一下; 需要确保密码非空吗? 那就用 gorm:"not null" 吧!

    // models.go 文件中
    package pkg
    
    import "gorm.io/gorm"
    
    type User struct {
        gorm.Model // 自动包含 ID 和 CreatedAt, UpdatedAt 字段,多省事啊!
    
        Name     string   `gorm:"unique"`                 // 用户姓名,唯一索引,避免重复啦!
        Email    string   `gorm:"varchar(255)"`           // 用户邮箱
        Password string   `gorm:"not null"`               // 用户密码,非空必填哦!
        Age      uint8    `gorm:"default:18"`             // 用户年龄,默认值为 18
        City     string   `gorm:"size:10"`                // 用户所在城市,长度最大为 10 个字符
        Hobbies  []string `gorm:"many2many:user_hobbies"` // 多对多的关联字段,灵活连接多种数据!
    }
    
  • 简单实体类(例如:用户) 上面的例子展示了一个简单的 User 模型。 它包含了姓名、邮箱、密码、年龄、城市以及爱好等信息。 你可以根据你的实际需求添加或修改字段,让它变得更强大! 比如,你想加入一个用户的头像信息吗?或者用户的生日呢?都可以轻松实现!

四、 连接数据库

好了! 模型设计完毕, 现在就让我们让 GORM 与你的数据库建立起连接吧! 想想看,这就像一把钥匙打开了通往数据宝库的大门, 你终于可以与数据开始互动啦!

注册驱动: 先来认识一下,GORM 支持各种类型的数据库, 但它可不是万能的魔法师,需要你告诉它你想用哪种数据库类型。所以第一步是,使用 gorm.RegisterDriver() 方法注册你的目标数据库驱动,就像为 GORM 准备一份专属菜单! MySQL?PostgreSQL?没问题,GORM 都能搞定!

创建连接实例: 接下来,我们就要创造一个连接实例,让 GORM 和数据库握手致意啦! 使用 gorm.New() 函数来创建一个数据库连接实例,就像搭建一座桥梁,把你的代码与数据库世界牢牢连接起来。 记得要告诉它数据库类型、地址、用户名、密码等等重要信息哦!

验证连接: 我们怎么能保证这栋桥梁稳固可靠呢?当然要进行测试啦! 使用 db.DB().Ping() 方法来测试连接状态,就像敲敲门确认是否有人在里面。 如果一切顺利,你将收到一个成功的响应;否则,你需要检查你的配置信息并调整它们,让这座桥梁更加坚固!

五、增删改查

连接成功了? 这意味着我们已经拥有了一个通往数据宝库的大门! 现在,让我们学习如何使用 GORM 进行增删改查操作,让我们的应用程序真正与数据世界互动起来!

创建(Insert): 想在数据库中添加新记录吗? 太简单了! 我们可以使用 gorm.ModelCreate() 方法来完成这个任务。 例如,我们可以用它来创建一个新的用户记录,将用户信息存储到数据库中。 读取(Select): 想要从数据库中查找特定记录吗? GORM 提供了 Find() 方法来帮助我们实现这个目标。 我们可以在查询条件中添加筛选条件,例如查找某个年龄段的用户,或者根据用户名查找特定用户的信息等等。
更新(Update): 如果需要修改现有记录的数据, GORM 的 Save() 方法会派上用场! 它允许我们更新记录的某些属性值,例如修改用户的密码或邮箱地址等。 删除(Delete): 想要从数据库中移除特定记录吗? 我们可以使用 Delete() 方法轻松完成这个操作。 例如,我们可以根据用户 ID 删除某个用户的信息。

package main

import (
        "fmt"

        "gorm.io/driver/mysql"
        "gorm.io/gorm"
)

// models.go 文件中定义的 User 结构体
type User struct {
    gorm.Model // 自动包含 ID 和 CreatedAt, UpdatedAt 字段
    Name string   `gorm:"unique"`              // 用户姓名,唯一索引
    Email    string   `gorm:"varchar(255)"`    // 用户邮箱
    Password string   `gorm:"not null"`        // 用户密码,非空必填
}

func main() {
        dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

        if err != nil {
                panic("failed to connect database")
        }

        // 创建一个新用户
        newUser := User{Name: "John Doe", Email: "john@example.com"}
        db.Create(&newUser)
        fmt.Println("Created user:", newUser) 

        // 查询所有用户
        var users []User
        db.Find(&users)
        fmt.Println("All users:", users)

        // 根据 ID 查询单个用户
        var user User
        db.Where("id = ?", 1).First(&user)
        fmt.Println("User with ID 1:", user)

        // 更新用户信息
        user.Name = "Jane Doe"
        db.Save(&user)
        fmt.Println("Updated user:", user)

        // 删除用户
        db.Delete(&user)
        fmt.Println("Deleted user:", user)
}

六、 其他操作,总结

有时我们需要将多个数据库操作作为一个整体进行,例如同时插入多个记录或更新多个表。这时 GORM 的 transaction() 方法派上用场, 可以保证所有操作成功执行或者全部回滚,确保数据的一致性,就像是在玩儿角色扮演游戏,一个步骤都不能出错!

在现实世界中,数据通常是相互关联的,GORM 支持通过关系定义来进行关联查询,例如查找某个用户的所有订单或查找某个商品的所有评论等等, 帮助你更轻松地处理复杂的数据关系,就好像是在编织一个复杂的网络一样~

GORM 简化了数据库操作过程,让开发更加高效和流畅。 它支持多种数据库类型,拥有丰富功能和易于理解的语法, 非常适合Go语言的开发人员。 如果你想进一步了解 GORM 的强大功能,可以参考官方文档和社区资源: