方向三:使用 GORM连接数据库,并实现增删改查 | 豆包MarsCode AI刷题

42 阅读3分钟

项目环境

操作系统:windows 11

数据库:mysql 8.0.36

IDE:Goland 2024.2.3

具体步骤

GORM基本操作

GORM参考文档:gorm.io/zh_CN/docs/…

  • 快速入门:

import相关包可用 go mod tidy 下载

如遇到下载失败,可以检查GOPROXY go env GOPROXY

设置国内源:go env -w GOPROXY=https://goproxy.cn,direct

这段代码是一个基于 Go 和 GORM 框架的简单示例程序 (来自GORM的快速入门),展示了如何连接到 MySQL 数据库并执行基本的 CRUD(创建、读取、更新、删除)操作。

package main

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

type Product struct {
    gorm.Model
    Code  string
    Price uint
}

func main() {
    //dsn := "your_username:your_password@tcp(127.0.0.1:3306)/your_db?charset=utf8mb4&parseTime=True&loc=Local"
    dsn := "root:root@tcp(127.0.0.1:3306)/my_test?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
       panic("failed to connect database")
    }

    // 迁移 schema
    db.AutoMigrate(&Product{})

    // Create
    db.Create(&Product{Code: "D42", Price: 100})

    // Read
    var product Product
    db.First(&product, 1)                 // 根据整型主键查找
    db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录

    // Update - 将 product 的 price 更新为 200
    db.Model(&product).Update("Price", 200)
    // Update - 更新多个字段
    db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
    db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

    // Delete - 删除 product
    db.Delete(&product, 1)
}

1. 引入包
import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
  • gorm.io/driver/mysql:这是 GORM 的 MySQL 驱动程序,用于连接 MySQL 数据库。
  • gorm.io/gorm:这是 GORM 的核心库,提供 ORM 功能。

2. 定义数据模型
type Product struct {
    gorm.Model
    Code  string
    Price uint
}
  • 定义了一个 Product 结构体,表示数据库中的 Product 表。

  • gorm.Model 是 GORM 提供的一个通用结构体,包含以下字段:

    • ID:主键
    • CreatedAt:记录创建时间
    • UpdatedAt:记录更新时间
    • DeletedAt:软删除时间(用于标记是否被删除)
  • CodePrice 是自定义字段,分别表示产品的代码和价格。


3. 连接数据库
dsn := "root:root@tcp(127.0.0.1:3306)/my_test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic("failed to connect database")
}
  • dsn:表示 MySQL 数据库的连接字符串。

    • root:root:数据库用户名和密码。
    • 127.0.0.1:3306:数据库的地址和端口。
    • my_test:数据库名称。
    • charset=utf8mb4:设置字符集为 utf8mb4,支持表情符号等。
    • parseTime=True:启用解析时间。
    • loc=Local:设置时区为本地时间。
  • gorm.Open:使用 GORM 打开数据库连接。

  • 如果连接失败,会调用 panic 抛出错误并终止程序。


4. 自动迁移
db.AutoMigrate(&Product{})
  • 这是 GORM 的自动迁移功能,会根据 Product 结构体的定义在数据库中创建(或更新)表。
  • 如果表已经存在但字段有变化,它会自动更新表结构。

5. 创建数据
db.Create(&Product{Code: "D42", Price: 100})
  • 创建一个 Product 记录,Code 字段为 "D42"Price 字段为 100
  • GORM 会自动生成 INSERT SQL 语句并插入到数据库中。

6. 读取数据
var product Product
db.First(&product, 1)                 // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
  • db.First(&product, 1) :根据主键 1 查找第一个匹配的记录。
  • db.First(&product, "code = ?", "D42") :通过条件查询,查找 Code"D42" 的第一条记录。
  • 查询的结果会存储到变量 product 中。

7. 更新数据
db.Model(&product).Update("Price", 200)
  • 更新单个字段,将 productPrice 字段更新为 200
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
  • Updates(Product{Price: 200, Code: "F42"}) :将 PriceCode 字段更新为 200"F42",GORM 会跳过结构体中的零值字段(如未赋值的字段)。
  • Updates(map[string]interface{}{"Price": 200, "Code": "F42"}) :使用 map 进行更新,指定更新的字段和值。

8. 删除数据
db.Delete(&product, 1)
  • 删除主键为 1Product 记录。
  • 实际上,如果模型中包含 gorm.Model 的话,这是一个软删除操作(记录不会物理删除,而是设置 DeletedAt 字段)。