用GORM实践对数据库的增删改查 | 豆包MarsCode AI刷题

89 阅读5分钟

作为一名 Go 语言新手,我最近一直在努力学习如何使用 GORM(Go 的 ORM 库)来操作数据库。在本文中,我将详细介绍如何使用 GORM 连接 MySQL 数据库,并实现增删改查的功能。

安装 GORM 和 MySQL 驱动

首先,我们需要安装 GORM 库和 MySQL 数据库驱动。可以使用 Go 的包管理工具 go get 来完成这项工作。安装驱动程序是非常重要的一步,它使我们能够连接数据库并执行后续的 CRUD 操作。

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

配置 MySQL 数据库

在使用 GORM 连接数据库之前,我们需要先配置好 MySQL 数据库。具体步骤如下:

  1. 安装 MySQL 数据库管理软件,比如 MySQL Workbench 或 MySQL Shell。
  2. 创建一个新的数据库,例如名为 mydb
  3. 创建一个新的数据库用户,例如用户名为 myuser,密码为 mypassword
  4. 为新创建的用户授予对 mydb 数据库的所有权限。
  5. 确保 MySQL 数据库在本地的 3306 端口上正常运行。

完成以上步骤后,我们就可以开始使用 GORM 连接 MySQL 数据库了。

连接 MySQL 数据库

有了驱动程序之后,就可以开始连接 MySQL 数据库了。连接 MySQL 需要提供一些额外的信息,如用户名、密码、地址、端口和数据库名称等。这些信息构成了 MySQL 的连接字符串。

package main

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

func main() {
    // 构建 MySQL 连接字符串
    dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"

    // 连接 MySQL 数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 后续的 CRUD 操作会在此基础上进行
}

连接数据库是我们进行后续 CRUD 操作的基础。通过构建正确的连接字符串,我们可以成功连接到 MySQL 数据库。

创建模型

接下来,我们需要定义一个模型(Model)来映射数据库表。以用户信息表为例:

type User struct {
    ID        uint   `gorm:"primaryKey"`
    Name      string `gorm:"not null"`
    Email     string `gorm:"uniqueIndex;not null"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

增删改查操作

模型定义决定了我们如何与数据库进行交互。它描述了数据表的结构,包括字段名称、数据类型和约束条件等。

创建(Create)

有了模型之后,就可以开始进行 CRUD 操作了。首先是创建新记录。

// 创建用户
user := User{Name: "John Doe", Email: "john.doe@example.com"}
result := db.Create(&user)
if result.Error != nil {
    panic(result.Error)
}
fmt.Println("Created User:", user.ID)

创建操作允许我们向数据库插入新的用户数据。只需要构造一个模型实例并调用 db.Create() 方法即可。

读取(Read)

接下来是读取记录的操作。

// 根据 ID 查找用户
var user User
db.First(&user, 1)
fmt.Println("Found User:", user.Name, user.Email)

// 查找所有用户
var users []User
db.Find(&users)
for _, u := range users {
    fmt.Println(u.Name, u.Email)
}

读取操作使我们能够从数据库中获取用户数据。我们可以根据主键 ID 查找单个用户,也可以查找数据表中的所有用户。

更新(Update)

更新记录也很简单。

// 更新用户信息
user.Name = "Jane Doe"
db.Save(&user)

更新操作允许我们修改已存在的用户数据。只需要更改模型实例的字段值,然后调用 db.Save() 方法即可。

删除(Delete)

最后是删除记录的操作。

// 删除用户
db.Delete(&user)

删除操作使我们能够从数据库中移除用户数据。通过传入模型实例,我们可以删除对应的记录。

总的来说,使用 GORM 连接 MySQL 数据库并实现 CRUD 操作是一个很不错的体验。每个步骤都发挥着重要的作用,帮助我们与数据库进行高效的交互。希望本文能够为你学习 Go 语言和 GORM 提供帮助。如果你还有任何其他问题,欢迎随时告诉我。

复杂查询

除了基本的 CRUD 操作,GORM 还支持更复杂的查询功能,如条件查询、关联查询和分页查询等。以下是一些生动的示例:

假设我们有一个电商平台,需要根据不同的业务需求进行数据查询。

  1. 根据订单金额查找用户 我们需要找出所有下过高价商品订单(金额大于 100 元)的用户。可以使用条件查询实现:

    type Order struct {
        ID     uint
        UserID uint
        Amount float64
    }
    
    var users []User
    db.Joins("Orders").Where("Orders.Amount > ?", 100).Group("Users.id").Find(&users)
    for _, u := range users {
        fmt.Println(u.Name, "has placed a high-value order")
    }
    

    这个查询首先关联了用户和订单表,然后根据订单金额大于 100 元的条件筛选出对应的用户。最后,我们按用户 ID 进行分组,获取所有符合条件的用户。

  2. 统计各类商品的销售情况 我们需要统计每种商品的总销售额和销量。可以使用分组和聚合查询实现:

    type SalesStats struct {
        Product string
        TotalAmount float64
        TotalQuantity int
    }
    
    var stats []SalesStats
    db.Model(&Order{}).Select("Product, SUM(Amount) as TotalAmount, COUNT(*) as TotalQuantity").Group("Product").Find(&stats)
    for _, stat := range stats {
        fmt.Printf("%s: Total Amount=%.2f, Total Quantity=%d\n", stat.Product, stat.TotalAmount, stat.TotalQuantity)
    }
    

    这个查询首先选择了订单表中的 Product、总销售额和总销量字段。然后根据商品进行分组统计,最终返回每种商品的销售情况。

  3. 分页查询近期订单 我们需要分页查询最近一周内的所有订单,每页显示 10 条。可以使用分页查询实现:

    var orders []Order
    db.Where("CreatedAt >= ?", time.Now().AddDate(0, 0, -7)).Limit(10).Offset((currentPage - 1) * 10).Find(&orders)
    for _, o := range orders {
        fmt.Printf("Order ID: %d, Product: %s, Amount: %.2f\n", o.ID, o.Product, o.Amount)
    }
    

    这个查询首先根据创建时间在最近一周内的条件筛选订单数据。然后使用 LimitOffset 实现分页功能,每页显示 10 条订单信息。