GORM实践 | 豆包MarsCode AI刷题

41 阅读5分钟

GORM实现数据库的增删改查

GORM 是一个功能强大的 Go 语言 ORM 库,它简化了与数据库的交互过程,使得开发者可以更专注于业务逻辑的实现。本文将详细介绍如何使用 GORM 连接数据库,并实现基本的增删改查(CRUD)操作。

1. 安装 GORM 和数据库驱动

首先,我们需要安装 GORM 和相应的数据库驱动。假设我们要连接的是 MySQL 数据库,可以使用以下命令安装:

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

2. 连接数据库

在 Go 中,连接数据库的第一步是初始化 GORM 的 DB 对象。我们需要提供数据库的连接信息,包括数据库类型、用户名、密码、主机地址、端口以及数据库名称。

以下是一个连接 MySQL 数据库的示例代码:

package main

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

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 {
        log.Fatal("Failed to connect to database:", err)
    }

    // 连接成功
    log.Println("Database connected successfully")
}

代码说明:

  • dsn 是数据库连接字符串,包含了数据库的用户名、密码、主机地址、端口以及数据库名称。
  • gorm.Open 函数用于打开数据库连接,返回一个 *gorm.DB 对象。如果连接失败,会返回一个错误。

3. 定义模型

在 GORM 中,模型(Model)是与数据库表对应的 Go 结构体。我们可以通过定义结构体来表示数据库中的表,GORM 会自动将结构体字段映射到数据库表的列。

假设我们有一个 User 表,包含 IDNameEmailCreatedAt 字段,我们可以定义如下模型:

type User struct {
    ID        uint   `gorm:"primaryKey"`
    Name      string
    Email     string
    CreatedAt time.Time
}

代码说明:

  • ID 字段被标记为 primaryKey,表示它是主键。
  • CreatedAt 字段会自动填充当前时间,如果数据库中没有该字段,GORM 会自动创建。

4. 创建表

在 GORM 中,我们可以使用 AutoMigrate 方法自动创建或更新数据库表结构。它会根据我们定义的模型自动生成相应的表结构。

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    // 自动迁移模型
    err = db.AutoMigrate(&User{})
    if err != nil {
        log.Fatal("Failed to migrate database:", err)
    }

    log.Println("Database migration successful")
}

代码说明:

  • db.AutoMigrate(&User{}) 会根据 User 模型自动创建或更新 users 表。

5. 插入数据

插入数据是数据库操作中最常见的操作之一。在 GORM 中,我们可以通过创建模型实例并调用 Create 方法来插入数据。

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    // 创建用户
    user := User{Name: "Ar", Email: "Ar@example.com"}
    result := db.Create(&user)
    if result.Error != nil {
        log.Fatal("Failed to create user:", result.Error)
    }

    log.Println("User created successfully with ID:", user.ID)
}

代码说明:

  • user := User{Name: "Ar", Email: "Ar@example.com"} 创建了一个 User 实例。
  • db.Create(&user)user 实例插入到数据库中,并返回一个 *gorm.DB 对象。
  • result.Error 用于检查插入操作是否成功。

6. 查询数据

查询数据是数据库操作中的另一个重要部分。GORM 提供了多种查询方法,包括 FindFirstLastWhere 等。

6.1 查询所有记录

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    var users []User
    result := db.Find(&users)
    if result.Error != nil {
        log.Fatal("Failed to query users:", result.Error)
    }

    log.Println("Found", len(users), "users")
    for _, user := range users {
        log.Println("User ID:", user.ID, "Name:", user.Name, "Email:", user.Email)
    }
}

6.2 根据条件查询

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    var user User
    result := db.Where("email = ?", "Ar@example.com").First(&user)
    if result.Error != nil {
        log.Fatal("Failed to query user:", result.Error)
    }

    log.Println("Found user with ID:", user.ID, "Name:", user.Name, "Email:", user.Email)
}

代码说明:

  • db.Find(&users) 查询所有 User 记录,并将结果存储在 users 切片中。
  • db.Where("email = ?", "Ar@example.com").First(&user) 根据 email 字段查询第一个匹配的记录。

7. 更新数据

更新数据是数据库操作中的常见操作之一。GORM 提供了 SaveUpdate 方法来更新记录。

7.1 更新单个字段

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    var user User
    result := db.First(&user, 1) // 根据 ID 查询用户
    if result.Error != nil {
        log.Fatal("Failed to query user:", result.Error)
    }

    // 更新用户名
    user.Name = "Yar"
    result = db.Save(&user)
    if result.Error != nil {
        log.Fatal("Failed to update user:", result.Error)
    }

    log.Println("User updated successfully")
}

7.2 更新多个字段

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    result := db.Model(&User{}).Where("id = ?", 1).Updates(User{Name: "Yar", Email: "Yar@example.com"})
    if result.Error != nil {
        log.Fatal("Failed to update user:", result.Error)
    }

    log.Println("User updated successfully")
}

代码说明:

  • db.Save(&user) 会更新 user 实例的所有字段。
  • db.Model(&User{}).Where("id = ?", 1).Updates(User{Name: "Yar", Email: "Yar@example.com"}) 会更新 id 为 1 的用户的 NameEmail 字段。

8. 删除数据

删除数据是数据库操作中的最后一个基本操作。GORM 提供了 Delete 方法来删除记录。

func main() {
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }

    var user User
    result := db.First(&user, 1) // 根据 ID 查询用户
    if result.Error != nil {
        log.Fatal("Failed to query user:", result.Error)
    }

    // 删除用户
    result = db.Delete(&user)
    if result.Error != nil {
        log.Fatal("Failed to delete user:", result.Error)
    }

    log.Println("User deleted successfully")
}

代码说明:

  • db.Delete(&user) 会删除 user 实例对应的记录。

9. 总结

通过本文的介绍,我们了解了如何使用 GORM 连接数据库,并实现了基本的增删改查操作。GORM 提供了简洁的 API,使得数据库操作变得非常方便。无论是简单的插入操作,还是复杂的查询和更新,GORM 都能帮助我们快速实现。

当然,GORM 的功能远不止这些,它还支持事务、关联查询、钩子函数等高级功能。如果你需要更复杂的操作,可以进一步探索 GORM 的文档和示例代码。

希望本文对你理解和使用 GORM 有所帮助!