GORM 连接数据库并实现 CRUD 操作

67 阅读3分钟

使用 GORM 连接数据库并实现 CRUD 操作

引言

GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,它允许开发者使用 Go 的结构体(structs)和方法(methods)来操作数据库,而不是直接编写 SQL 语句。这种方式使得代码更加简洁、易于维护,并且减少了重复的数据库操作代码。本文将详细介绍如何使用 GORM 连接数据库,并实现增删改查(CRUD)操作。

环境准备

在开始之前,请确保你已经安装了 Go 语言环境和数据库(如 MySQL、PostgreSQL、SQLite 等)。以下是使用 GORM 的基本步骤:

  1. 安装 GORM:使用 go get 命令安装 GORM 及其数据库驱动。

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

    这里以 SQLite 为例,如果你使用的是其他数据库,需要安装对应的驱动。

  2. 创建数据库和表:在数据库中创建一个表,用于演示 CRUD 操作。

连接数据库

在 Go 应用程序中,连接数据库是第一步。以下是如何使用 GORM 连接 SQLite 数据库的示例:

package main

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

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

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

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

    // 其他 CRUD 操作...
}

在上述代码中,gorm.Open 函数用于连接数据库,sqlite.Open("test.db") 指定了 SQLite 数据库文件的路径。&gorm.Config{} 是一个配置对象,可以在这里配置 GORM 的行为,例如是否打印 SQL 日志等。

创建(Create)

创建记录是 CRUD 操作中的第一个操作,GORM 提供了多种方法来创建记录。

func main() {
    // ...之前的代码

    // 创建记录
    product := Product{Code: "D42", Price: 100}
    result := db.Create(&product) // 赋值给 product,因为它有 Before/After Hooks
    if result.Error != nil {
        log.Fatal("Failed to create product:", result.Error)
    }

    // 打印创建结果
    log.Println("Created Product:", product)
}

在上述代码中,我们创建了一个 Product 结构体的实例,并设置了 CodePrice 字段。然后使用 db.Create 方法将这个实例插入到数据库中。如果操作成功,product 实例将包含数据库生成的主键等信息。

读取(Read)

读取操作是 CRUD 中最常见的操作之一,GORM 提供了多种方法来查询数据库中的记录。

func main() {
    // ...之前的代码

    // 根据 ID 查找
    var product Product
    db.First(&product, 1) // 根据主键查询
    if errors.Is(db.Error, gorm.ErrRecordNotFound) {
        log.Println("Product not found")
    } else if db.Error != nil {
        log.Fatal(db.Error)
    } else {
        log.Println("Found Product:", product)
    }

    // 根据条件查询
    db.Where("code = ?", "D42").First(&product)
    if errors.Is(db.Error, gorm.ErrRecordNotFound) {
        log.Println("Product not found")
    } else if db.Error != nil {
        log.Fatal(db.Error)
    } else {
        log.Println("Found Product:", product)
    }
}

在上述代码中,First 方法用于查询第一条匹配的记录。Where 方法用于添加查询条件。如果查询不到记录,GORM 会返回 gorm.ErrRecordNotFound 错误。

更新(Update)

更新操作用于修改数据库中已存在的记录。

func main() {
    // ...之前的代码

    // 更新记录
    product := Product{ID: 1}
    db.First(&product, 1)
    if db.Error != nil {
        log.Fatal(db.Error)
    }
    product.Price = 200
    result := db.Save(&product)
    if result.Error != nil {
        log.Fatal("Failed to update product:", result.Error)
    }

    // 打印更新结果
    log.Println("Updated Product:", product)
}

在上述代码中,我们首先通过 First 方法查询到要更新的记录,然后修改 Price 字段的值,并使用 Save 方法更新记录。Save 方法会根据结构体的字段和数据库中的记录进行比较,只更新被修改的字段。

删除(Delete)

删除操作用于从数据库中移除记录。

func main() {
    // ...之前的代码

    // 删除记录
    product := Product{ID: 1}
    result := db.Delete(&product, 1)
    if result.Error != nil {
        log.Fatal("Failed to delete product:", result.Error)
    }

    // 打印删除结果
    log.Println("Deleted Product:", product)
}

在上述代码中,我们使用 Delete 方法删除了 ID 为 1 的记录。Delete 方法的第一个参数是要删除的记录的指针,第二个参数是条件。

总结

本文详细介绍了如何使用 GORM 连接数据库,并实现增删改查(CRUD)操作。GORM 提供了丰富的接口和方法,使得数据库操作变得简单和直观。通过上述步骤,你可以轻松地在 Go 语言项目中集成数据库操作。