使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作 | 豆包MarsCode AI刷题

73 阅读4分钟

- 使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作

GORM 是 Go 语言的一个强大的 ORM(对象关系映射)库,它使得 Go 开发者可以以面向对象的方式与数据库交互,避免了编写大量 SQL 语句,同时提供了丰富的功能,诸如关联查询、事务处理、自动迁移等。本文将介绍如何使用 GORM 连接数据库,并实现增、删、改、查(CRUD)操作。

1. 环境准备

首先,我们需要安装 GORM 和所需的数据库驱动。

1.1. 安装 GORM 和数据库驱动

GORM 支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。以下示例将使用 MySQL 数据库。

  1. 安装 GORM

    使用 Go modules 管理依赖,首先初始化 Go 项目:

    go mod init gorm_example
    

    然后安装 GORM 和 MySQL 驱动:

    go get github.com/jinzhu/gorm
    go get github.com/jinzhu/gorm/dialects/mysql
    
  2. MySQL 数据库准备

    确保 MySQL 数据库已经安装并运行。你可以使用以下命令创建一个数据库:

    CREATE DATABASE gorm_example;
    

2. 连接数据库

在 Go 中,GORM 提供了 gorm.Open() 函数来连接数据库。我们将使用 MySQL 连接示例。

package main

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

var db *gorm.DB
var err error

func init() {
    // 数据库连接信息
    dsn := "root:password@tcp(127.0.0.1:3306)/gorm_example?charset=utf8mb4&parseTime=True&loc=Local"

    // 打开 MySQL 数据库连接
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("连接数据库失败:", err)
    }
    fmt.Println("数据库连接成功")
}

func main() {
    // 在 main 函数中调用初始化
    init()
}
  • dsn:数据源名称(Data Source Name),它包含了数据库的连接信息。

    • root:password:数据库用户名和密码。
    • tcp(127.0.0.1:3306):数据库的地址和端口。
    • /gorm_example:要连接的数据库名称。
    • charset=utf8mb4&parseTime=True&loc=Local:一些 MySQL 特定的配置项。

3. 定义模型

GORM 使用 Go 结构体(struct)来映射数据库中的表。我们可以根据需要定义结构体并映射到数据库表。

type User struct {
    ID       uint   `gorm:"primarykey"` // 主键
    Name     string `gorm:"size:100"`   // 姓名,最大长度为 100
    Age      int    // 年龄
    Email    string `gorm:"uniqueIndex"` // 唯一索引
    CreatedAt time.Time
    UpdatedAt time.Time
}
  • gorm:"primarykey":指定 ID 字段为主键。
  • gorm:"size:100":指定 Name 字段的最大长度为 100 字符。
  • gorm:"uniqueIndex":指定 Email 字段为唯一索引。

4. 数据库迁移(自动创建表)

GORM 提供了自动迁移的功能,可以根据模型结构自动创建数据库表。

func migrate() {
    // 自动迁移数据库表结构
    err := db.AutoMigrate(&User{})
    if err != nil {
        log.Fatal("迁移失败:", err)
    }
    fmt.Println("数据库迁移成功")
}

在程序启动时,调用 db.AutoMigrate(&User{}) 可以创建数据库中的 users 表(如果表不存在)。

5. 实现增、删、改、查操作

5.1. 创建数据(Create)

我们可以使用 Create 方法向数据库插入一条数据。

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

    // 创建用户
    result := db.Create(&user)

    if result.Error != nil {
        log.Fatal("插入数据失败:", result.Error)
    }

    fmt.Println("插入数据成功:", user)
}
  • db.Create(&user):插入一条记录到数据库。&user 是传递的结构体指针,GORM 会将结构体中的字段映射到数据库中的列。

5.2. 查询数据(Read)

我们可以使用 First, Find, Where 等方法来查询数据。

查询单个记录
func getUserByID(id uint) {
    var user User
    result := db.First(&user, id)
    
    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }

    fmt.Println("查询结果:", user)
}
  • db.First(&user, id):查询 idid 的第一条记录。
查询多个记录
func getUsers() {
    var users []User
    result := db.Find(&users)

    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }

    fmt.Println("查询结果:", users)
}
  • db.Find(&users):查询所有用户。

5.3. 更新数据(Update)

更新数据时,我们需要首先查询出要更新的记录,然后修改相应字段并保存。

func updateUser(id uint) {
    var user User
    result := db.First(&user, id)
    
    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }

    user.Name = "Bob"
    user.Age = 30

    // 更新用户
    db.Save(&user)

    fmt.Println("更新成功:", user)
}
  • db.Save(&user):保存更新后的数据。注意:Save 会检查是否存在 ID,若存在则更新,若不存在则插入新记录。

5.4. 删除数据(Delete)

删除数据可以使用 Delete 方法。

func deleteUser(id uint) {
    var user User
    result := db.First(&user, id)
    
    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }

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

    fmt.Println("删除成功")
}
  • db.Delete(&user):删除 idid 的用户记录。

6. 完整代码示例

package main

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

var db *gorm.DB
var err error

type User struct {
    ID        uint      `gorm:"primarykey"`
    Name      string    `gorm:"size:100"`
    Age       int
    Email     string    `gorm:"uniqueIndex"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

func init() {
    // 数据库连接信息
    dsn := "root:password@tcp(127.0.0.1:3306)/gorm_example?charset=utf8mb4&parseTime=True&loc=Local"
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("连接数据库失败:", err)
    }
    fmt.Println("数据库连接成功")
    migrate()
}

func migrate() {
    err := db.AutoMigrate(&User{})
    if err != nil {
        log.Fatal("迁移失败:", err)
    }
    fmt.Println("数据库迁移成功")
}

func createUser() {
    user := User{
        Name:  "Alice",
        Age:   25,
        Email: "alice@example.com",
    }
    result := db.Create(&user)
    if result.Error != nil {
        log.Fatal("插入数据失败:", result.Error)
    }
    fmt.Println("插入数据成功:", user)
}

func getUserByID(id uint) {
    var user User
    result := db.First(&user, id)
    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }
    fmt.Println("查询结果:", user)
}

func updateUser(id uint) {
    var user User
    result := db.First(&user, id)
    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }
    user.Name = "Bob"
    user.Age = 30
    db.Save(&user)
    fmt.Println("更新成功:", user)
}

func deleteUser(id uint) {
    var user User
    result := db.First(&user, id)
    if result.Error != nil {
        log.Fatal("查询数据失败:", result.Error)
    }
    db.Delete(&user)
    fmt.Println("删除成功")
}

func main() {
    init

() createUser() getUserByID(1) updateUser(1) deleteUser(1) }


### 7. 总结

本文介绍了如何使用 GORM 连接 MySQL 数据库,并实现基本的增、删、改、查操作。通过 GORM,Go 开发者可以高效地进行数据库操作,减少手动编写 SQL 语句的工作量。同时,GORM 提供了丰富的功能,如自动迁移、关联查询等,适用于构建更复杂的应用程序。