Go中Gorm使用初体验

127 阅读2分钟

以下是一个使用 GORM 实现增删改查(CRUD)操作的完整示例。这个示例演示了如何连接到数据库、定义模型、创建记录、查询记录、更新记录和删除记录。

先决条件

  1. 安装 GORM 库和适当的数据库驱动(例如,SQLite 驱动):
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

示例代码

1. 导入必要的包

package main

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

2. 定义模型

type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string
    Email string
}

3. 连接到数据库

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

    // 自动迁移模式
    db.AutoMigrate(&User{})

4. 创建记录

    // 创建记录
    user := User{Name: "John", Email: "john@example.com"}
    result := db.Create(&user)
    if result.Error != nil {
        fmt.Println("Failed to create user:", result.Error)
    } else {
        fmt.Println("User created:", user)
    }

5. 查询记录

    // 查询记录
    var queriedUser User
    db.First(&queriedUser, user.ID)
    fmt.Println("Queried User:", queriedUser)

6. 更新记录

    // 更新记录
    db.Model(&queriedUser).Update("Email", "john_updated@example.com")
    fmt.Println("Updated User:", queriedUser)

7. 删除记录

    // 删除记录
    db.Delete(&queriedUser)
    fmt.Println("User deleted")
}

8. 完整代码

package main

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

// User 模型
type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string
    Email string
}

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

    // 自动迁移模式
    db.AutoMigrate(&User{})

    // 创建记录
    user := User{Name: "John", Email: "john@example.com"}
    result := db.Create(&user)
    if result.Error != nil {
        fmt.Println("Failed to create user:", result.Error)
    } else {
        fmt.Println("User created:", user)
    }

    // 查询记录
    var queriedUser User
    db.First(&queriedUser, user.ID)
    fmt.Println("Queried User:", queriedUser)

    // 更新记录
    db.Model(&queriedUser).Update("Email", "john_updated@example.com")
    fmt.Println("Updated User:", queriedUser)

    // 删除记录
    db.Delete(&queriedUser)
    fmt.Println("User deleted")
}

解释

  1. 定义模型
    • User 模型定义了 IDNameEmail 字段。
  1. 连接数据库
    • 使用 GORM 连接到 SQLite 数据库并自动迁移 User 模型。
  1. 创建记录
    • 创建一个 User 实例并插入到数据库中。
  1. 查询记录
    • 根据 ID 查询刚创建的用户。
  1. 更新记录
    • 更新查询到的用户的 Email 字段。
  1. 删除记录
    • 删除查询到的用户。

通过这个完整的示例,您可以了解如何使用 GORM 执行基本的 CRUD 操作。如果需要使用其他数据库(如 MySQL、PostgreSQL 等),只需更改数据库驱动和连接方式即可。

使用带有 Context 上下文的操作

在使用 GORM 时,可以通过上下文(context)来进行操作,以便更好地控制数据库操作的生命周期,支持超时、取消等特性。以下是一个带有 context 的 GORM 操作示例。

package main

import (
    "context"
    "fmt"
    "time"

    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

// User 模型
type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string
    Email string
}

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

    // 自动迁移模式
    db.AutoMigrate(&User{})

    // 创建一个 context,设置超时为 5 秒
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 创建记录
    user := User{Name: "John", Email: "john@example.com"}
    if err := db.WithContext(ctx).Create(&user).Error; err != nil {
        fmt.Println("Failed to create user:", err)
    } else {
        fmt.Println("User created:", user)
    }

    // 查询记录
    var queriedUser User
    if err := db.WithContext(ctx).First(&queriedUser, user.ID).Error; err != nil {
        fmt.Println("Failed to query user:", err)
    } else {
        fmt.Println("Queried User:", queriedUser)
    }

    // 更新记录
    if err := db.WithContext(ctx).Model(&queriedUser).Update("Email", "john_updated@example.com").Error; err != nil {
        fmt.Println("Failed to update user:", err)
    } else {
        fmt.Println("Updated User:", queriedUser)
    }

    // 删除记录
    if err := db.WithContext(ctx).Delete(&queriedUser).Error; err != nil {
        fmt.Println("Failed to delete user:", err)
    } else {
        fmt.Println("User deleted")
    }
}