GORM入门| 青训营

81 阅读5分钟

Gorm 是一个用于 Go 语言的 ORM(Object Relational Mapping)库,它提供了简洁的 API 和丰富的功能,使得在 Go 语言中与数据库交互变得更加便捷和高效。Gorm 支持多种主流数据库,并提供了强大的查询构造、模型关联、事务处理等功能,使得开发人员可以更专注于业务逻辑的实现。

一、安装和初始化

1. 安装 Gorm 库:

可以使用以下命令安装 Gorm 包:

go get -u github.com/go-gorm/gorm

2. 初始化一个 Gorm 项目:

在开始使用 Gorm 之前,我们需要先初始化一个 Gorm 项目。可以按照以下步骤进行初始化:

a. 创建一个新的目录,并进入该目录。

b. 执行以下命令来初始化一个 Go 模块:

go mod init example.com/mygormproj

这将会创建一个 go.mod 文件,用于管理项目的依赖项。

c. 创建一个名为 main.go 的文件,并在其中添加以下代码:

package main

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

func main() {
    // 配置数据库连接信息
    dsn := "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

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

    // Add your code here

    db.Close()
}

在上面的代码中,我们使用了 MySQL 作为示例数据库,你可以根据自己的需要修改数据库连接信息。

完成以上步骤后,Gorm 项目的初始化就完成了。

二、定义模型和数据库迁移

1. 定义模型:

在 Gorm 中,我们可以通过创建结构体来定义数据库表的模型。每个字段代表表中的一个列,并且可以使用结构体标签(tag)来设置更多的属性,如字段名、数据类型、约束等。

例如,我们创建一个名为 User 的模型:

type User struct {
    gorm.Model
    Name  string `gorm:"unique"`
    Email string `gorm:"unique"`
    Age   uint
}

上面的代码中,我们使用 gorm.Model 内嵌了一个包含 ID、CreatedAt、UpdatedAt 和 DeletedAt 等字段的结构体,这些字段是 Gorm 提供的默认字段。

2. 数据库迁移:

数据库迁移是将数据库表结构更新到最新版本的过程。Gorm 提供了自动化的数据库迁移工具,可以根据模型定义自动生成对应的数据表。

在 Gorm 中,通过使用 AutoMigrate() 方法来执行数据库迁移。在 main() 函数中添加以下代码:

// 自动迁移数据库
db.AutoMigrate(&User{})

运行程序后,Gorm 将会自动创建名为 users 的数据表,并根据模型定义设置列的属性。

三、查询和操作数据

1. 创建记录:

使用 Gorm,可以使用 Create() 方法来向数据库中插入新的记录。例如,我们创建一个新的用户记录:

user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
db.Create(&user)

上述代码将会向 users 表中插入一条新的记录。

2. 查询记录:

Gorm 提供了丰富的方法来执行查询操作。可以使用 Find()First()Last() 等方法来获取记录。例如,我们查询年龄为 25 的用户:

var user User
db.Where("age = ?", 25).First(&user)

上述代码将会从 users 表中找到第一个年龄为 25 的用户,并将其赋值给 user 变量。

3. 更新记录:

使用 Gorm,可以使用 Model() 方法指定要更新的模型,并使用 Updates() 方法来更新记录。例如,我们更新用户的年龄:

db.Model(&user).Updates(User{Age: 30})

上述代码将会将 user 对应的用户记录的年龄更新为 30。

4. 删除记录:

Gorm 提供了 Delete() 方法用于删除数据库中的记录。例如,我们删除年龄为 30 的用户:

db.Delete(&User{}, "age = ?", 30)

上述代码将会从 users 表中删除所有年龄为 30 的用户记录。

四、高级功能

除了基本的 CRUD 操作之外,Gorm 还提供了一些高级功能,如查询构造、模型关联、事务处理等。

1. 查询构造:

Gorm 具有强大的查询构造能力,可以通过链式调用方法来构建复杂的查询条件。例如,我们查询年龄在 20 到 30 之间的用户,并按照创建时间倒序排序:

var users []User
db.Where("age BETWEEN ? AND ?", 20, 30).Order("created_at desc").Find(&users)

2. 模型关联:

在数据库中,表与表之间可能存在关联关系。Gorm 提供了模型关联的功能,可以简化数据关联的操作。例如,我们定义一个模型关联,使 User 拥有多个 Article:

type User struct {
    gorm.Model
    Name     string
    Email    string
    Age      uint
    Articles []Article
}

type Article struct {
    gorm.Model
    Title   string
    Content string
    UserID  uint
}

上述代码中,我们在 User 模型中定义了一个 Articles 字段,表示 User 和 Article 之间的一对多关系。

3. 事务处理:

Gorm 支持事务处理,可以确保一系列的数据库操作要么全部成功,要么全部失败回滚。例如,我们使用事务来创建一个新用户和一篇新文章:

tx := db.Begin()

// 创建一个新用户
user := User{Name: "Bob", Email: "bob@example.com", Age: 30}
if err := tx.Create(&user).Error; err != nil {
    tx.Rollback()
    return err
}

// 创建一篇新文章
article := Article{Title: "Hello", Content: "Gorm is awesome!", UserID: user.ID}
if err := tx.Create(&article).Error; err != nil {
    tx.Rollback()
    return err
}

// 提交事务
tx.Commit()

上述代码中,我们首先通过 db.Begin() 开启一个事务,然后在事务中执行创建用户和创建文章的操作。如果任何一个操作失败,我们会调用 tx.Rollback() 回滚事务,否则,我们将调用 tx.Commit() 提交事务。