使用GORM实现Go Web项目中数据库增删改查操作的实践笔记 | 豆包MarsCode AI刷题

87 阅读3分钟

GORM 在 Go 中实现清单项目 CRUD 操作详细笔记

1. 项目背景

在现代软件开发中,清单项目是一种常见的应用场景,它可以帮助用户管理待办事项、购物清单等。使用 GORM,我们可以轻松地在 Go 语言中实现这些功能,而无需直接处理底层的 SQL 语句。

2. 安装 GORM 和数据库驱动

首先,我们需要安装 GORM 库以及对应的数据库驱动。以 SQLite 为例,安装命令如下:

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

3. 定义数据模型

在 Go 中,我们通过定义结构体来表示数据库中的表。对于清单项目,我们可能需要两个模型:TodoListTodoItem

type TodoList struct {
    gorm.Model
    Name  string
    Items []TodoItem `gorm:"foreignKey:ListID"`
}

type TodoItem struct {
    gorm.Model
    Description string
    Completed   bool
    ListID      uint
}

这里,gorm.Model 是 GORM 的一个内嵌结构体,它包含了一些基本的字段,如 ID、创建时间等。Items 字段表示 TodoListTodoItem 之间的一对多关系。

4. 连接数据库

在主函数中,我们使用 GORM 连接到 SQLite 数据库,并进行自动迁移,以确保数据库表结构与我们的模型相匹配。

func main() {
    db, err := gorm.Open(sqlite.Open("todo.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database: " + err.Error())
    }

    // 自动迁移 schema,创建或更新表结构
    db.AutoMigrate(&TodoList{}, &TodoItem{})
}

5. CRUD 操作详解

创建(Create)

创建操作用于添加新的数据记录到数据库中。

func createList(db *gorm.DB, name string) {
    list := TodoList{Name: name}
    db.Create(&list) // 创建清单
    if db.Error != nil {
        panic(db.Error)
    }
}

func createItem(db *gorm.DB, listID uint, description string) {
    item := TodoItem{Description: description, ListID: listID}
    db.Create(&item) // 创建清单项
    if db.Error != nil {
        panic(db.Error)
    }
}

读取(Read)

读取操作用于从数据库中检索数据。

func findList(db *gorm.DB, listID uint) {
    var list TodoList
    db.Preload("Items").First(&list, listID) // 预加载清单项并查询
    if db.Error != nil {
        panic(db.Error)
    }
    println("TodoList:", list.Name)
    for _, item := range list.Items {
        println("Item:", item.Description, "Completed:", item.Completed)
    }
}

更新(Update)

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

func updateItem(db *gorm.DB, itemID uint, completed bool) {
    var item TodoItem
    db.First(&item, itemID)
    item.Completed = completed
    db.Save(&item) // 更新清单项
    if db.Error != nil {
        panic(db.Error)
    }
}

删除(Delete)

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

func deleteItem(db *gorm.DB, itemID uint) {
    db.Delete(&TodoItem{}, itemID) // 删除清单项
    if db.Error != nil {
        panic(db.Error)
    }
}

func deleteList(db *gorm.DB, listID uint) {
    db.Delete(&TodoList{}, listID) // 删除清单
    if db.Error != nil {
        panic(db.Error)
    }
}

6. 事务处理

在处理多个相关操作时,使用事务可以确保数据的一致性和完整性。

func transactionExample(db *gorm.DB) {
    tx := db.Begin()
    // 创建清单和清单项
    tx.Create(&TodoList{Name: "New List"})
    tx.Create(&TodoItem{Description: "New Item", ListID: 1})
    if tx.Error != nil {
        tx.Rollback()
        panic(tx.Error)
    } else {
        tx.Commit()
    }
}

7. 注意事项

  • 在实际应用中,数据库连接信息(如用户名、密码、数据库地址)应该从配置文件或环境变量中读取,而不是硬编码在代码中。
  • 使用 AutoMigrate() 方法时,GORM 会自动创建或更新数据库表结构,这在开发初期非常方便,但在生产环境中应该谨慎使用。
  • 在 CRUD 操作中,应该检查并处理可能发生的错误,以确保程序的健壮性。
  • 使用 Preload 方法来预加载关联数据,可以减少查询次数,提高程序性能。

通过上述步骤,你可以在 Go 语言项目中使用 GORM 来管理一个清单项目的数据库操作,从而简化开发流程并提高开发效率。

实现效果

image.png