伴学笔记 GORM实践 | 豆包MarsCode AI刷题

26 阅读4分钟

1. GORM 简介

GORM 是一个 Go 语言的 ORM(对象关系映射)库,它使得操作数据库变得更为简洁和高效。GORM 提供了丰富的功能,包括数据库连接、模型定义、增删改查、事务、预加载、关联查询等。通过 GORM,开发者可以使用 Go 语言进行数据库操作,而无需写复杂的 SQL 语句。

2. 安装 GORM

首先,确保 Go 环境已安装。然后使用 go get 安装 GORM:

go get -u github.com/jinzhu/gorm
go get -u github.com/jinzhu/gorm/dialects/mysql

在安装完 GORM 后,您需要导入 GORM 和您使用的数据库驱动(如 MySQL)。

3. 配置数据库连接

GORM 支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。在本例中,我们将使用 MySQL 作为数据库。

go
复制代码
package main

import (
    "fmt"
    "log"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql" // MySQL 驱动
)

var db *gorm.DB
var err error

func init() {
    // 连接数据库
    db, err = gorm.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        log.Fatalf("failed to connect to database: %v", err)
    }
    fmt.Println("数据库连接成功")
}

func main() {
    // 程序主逻辑
    defer db.Close()  // 确保在程序退出时关闭数据库连接
}

4. 定义模型

在 GORM 中,我们通过定义 Go 结构体来映射数据库表。每个结构体字段对应数据库表中的一列。

go
复制代码
type User struct {
    ID       uint   `gorm:"primary_key"`
    Name     string `gorm:"type:varchar(100);not null"`
    Age      int
    Email    string `gorm:"type:varchar(100);unique_index"`
}

在这个模型中,我们定义了一个 User 结构体,它对应数据库中的 users 表。GORM 会自动根据结构体的字段生成 SQL 语句。

5. 执行增删改查操作

5.1 增加数据(Create)

使用 GORM 的 Create 方法可以将一个结构体实例插入数据库。

go
复制代码
func createUser() {
    user := User{Name: "Alice", Age: 25, Email: "alice@example.com"}
    if err := db.Create(&user).Error; err != nil {
        fmt.Println("插入失败:", err)
    } else {
        fmt.Println("插入成功:", user)
    }
}

5.2 查询数据(Read)

使用 GORM 的 FindFirst 方法可以查询数据。Find 返回所有匹配记录,First 返回第一条匹配记录。

go
复制代码
func getUserByID() {
    var user User
    if err := db.First(&user, 1).Error; err != nil {
        fmt.Println("查询失败:", err)
    } else {
        fmt.Println("查询成功:", user)
    }
}

func getAllUsers() {
    var users []User
    if err := db.Find(&users).Error; err != nil {
        fmt.Println("查询失败:", err)
    } else {
        fmt.Println("查询所有用户成功:", users)
    }
}

5.3 更新数据(Update)

使用 GORM 的 SaveUpdate 方法可以更新记录。Save 会根据主键更新记录,而 Update 则仅更新指定字段。

go
复制代码
func updateUser() {
    var user User
    if err := db.First(&user, 1).Error; err != nil {
        fmt.Println("未找到用户:", err)
        return
    }

    // 更新用户的年龄
    user.Age = 30
    if err := db.Save(&user).Error; err != nil {
        fmt.Println("更新失败:", err)
    } else {
        fmt.Println("更新成功:", user)
    }
}

5.4 删除数据(Delete)

使用 GORM 的 Delete 方法可以删除记录。可以通过 ID 删除记录,也可以根据条件删除。

go
复制代码
func deleteUser() {
    var user User
    if err := db.First(&user, 1).Error; err != nil {
        fmt.Println("未找到用户:", err)
        return
    }

    if err := db.Delete(&user).Error; err != nil {
        fmt.Println("删除失败:", err)
    } else {
        fmt.Println("删除成功:", user)
    }
}

6. 处理数据库迁移

GORM 还提供了自动迁移功能,使得数据库表结构可以随着模型的变化而自动更新。通过 AutoMigrate 方法可以创建或更新表结构。

go
复制代码
func migrate() {
    db.AutoMigrate(&User{})
    fmt.Println("数据库迁移完成")
}

7. 完整代码示例

go
复制代码
package main

import (
    "fmt"
    "log"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

var db *gorm.DB
var err error

type User struct {
    ID    uint   `gorm:"primary_key"`
    Name  string `gorm:"type:varchar(100);not null"`
    Age   int
    Email string `gorm:"type:varchar(100);unique_index"`
}

func init() {
    db, err = gorm.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        log.Fatalf("failed to connect to database: %v", err)
    }
    fmt.Println("数据库连接成功")
}

func migrate() {
    db.AutoMigrate(&User{})
    fmt.Println("数据库迁移完成")
}

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

func getUserByID() {
    var user User
    if err := db.First(&user, 1).Error; err != nil {
        fmt.Println("查询失败:", err)
    } else {
        fmt.Println("查询成功:", user)
    }
}

func updateUser() {
    var user User
    if err := db.First(&user, 1).Error; err != nil {
        fmt.Println("未找到用户:", err)
        return
    }

    user.Age = 30
    if err := db.Save(&user).Error; err != nil {
        fmt.Println("更新失败:", err)
    } else {
        fmt.Println("更新成功:", user)
    }
}

func deleteUser() {
    var user User
    if err := db.First(&user, 1).Error; err != nil {
        fmt.Println("未找到用户:", err)
        return
    }

    if err := db.Delete(&user).Error; err != nil {
        fmt.Println("删除失败:", err)
    } else {
        fmt.Println("删除成功:", user)
    }
}

func main() {
    defer db.Close()
    migrate()    // 自动迁移数据库
    createUser() // 增加数据
    getUserByID() // 查询单条记录
    updateUser()  // 更新数据
    deleteUser()  // 删除数据
}

8. 总结

通过 GORM可以非常便捷地与数据库进行交互,免去了大量手动编写 SQL 语句的麻烦。本文介绍了如何使用 GORM 进行数据库连接和增删改查(CRUD)操作。