青训营笔记5:Gorm| 青训营

81 阅读6分钟

Gorm

介绍

GORM(Go Object Relational Mapping)是一个用于Go编程语言的对象关系映射(ORM)库,它的目标是简化数据库操作并提供一种方便的方式来将Go应用程序与关系型数据库进行交互。ORM库允许开发人员使用面向对象的方式来操作数据库,而不必编写大量的SQL查询语句。

以下是GORM的一些主要特点和用法:

  1. 模型定义:使用GORM时,您可以定义Go结构体来表示数据库表。每个字段对应表中的一列,并且可以使用标记来指定字段的名称、数据类型和约束。
  2. 查询构建:GORM提供了强大的查询构建器,使您可以轻松地编写复杂的数据库查询。您可以执行诸如过滤、排序、分页等操作。
  3. 事务支持:GORM支持数据库事务,这是一种将一系列数据库操作捆绑在一起以确保原子性的方法。
  4. 数据库迁移:GORM可以自动生成数据库迁移,帮助您保持数据库结构与模型的同步。这对于在开发过程中进行数据库更改非常有用。
  5. 钩子函数:您可以使用GORM的钩子函数来在模型的不同生命周期阶段执行自定义操作,如在保存、更新或删除记录之前或之后。
  6. 关联关系:GORM支持定义和查询模型之间的关联关系,包括一对一、一对多和多对多关系。
  7. 数据库支持:GORM支持多种关系型数据库,包括MySQL、PostgreSQL、SQLite和Microsoft SQL Server等。

以下是一个简单的示例,展示了如何使用GORM定义一个模型和进行基本的数据库操作: ​ // 定义模型 ​

需要注意的是,GORM的具体用法可能会根据不同的版本和配置略有不同,因此建议查看最新的文档以获取最新信息和示例代码。

CURD操作

CRUD通常指数据库的增删改查操作,本文介绍了如何使用GORM实现创建、查询、更新和删除操作。

创建

可以用Create()创建一个或多个记录。

查询

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。查询单个数据时需要传入一个接收数据的变量的地址。

还提供了Find方法,可以查询符合条件的所有数据,需要传入一个改类型的结构体变量切片的地址。

更新

GORM提供了丰富的功能来执行数据库记录的更新操作,这些操作可以帮助您轻松地更新数据库中的数据。以下是GORM中更新功能的简介:

  1. UpdateUpdate 方法用于更新数据库中的记录。您可以传递一个结构体,其中包含要更新的字段和它们的新值,也可以传递一个 map 来指定要更新的字段和值。以下是示例代码:

    // 更新指定字段
    db.Model(&user).Update("Name", "NewName")
    ​
    // 更新多个字段
    db.Model(&user).Updates(User{Name: "NewName", Age: 30})
    
  2. UpdatesUpdates 方法用于更新多个字段。您可以传递一个结构体或 map 来指定要更新的字段和它们的新值。与 Update 不同,Updates 可以更新多个字段而无需一个接一个地调用。

  3. SelectSelect 方法允许您选择要更新的字段。这对于更新记录中的部分字段而不是所有字段非常有用。

    db.Model(&user).Select("Name").Update("Name", "NewName")
    
  4. OmitOmit 方法允许您指定要排除的字段,这意味着除了指定的字段之外,其他字段将被更新。

    db.Model(&user).Omit("Age").Updates(User{Name: "NewName"})
    
  5. UpdatesColumnUpdatesColumn 方法用于更新指定字段的值,而不会更新记录的 UpdatedAt 时间戳。这对于更新记录而不影响其 "更新时间" 字段很有用。

    db.Model(&user).UpdatesColumn(map[string]interface{}{"Name": "NewName"})
    
  6. UpdateColumnUpdateColumn 方法用于更新单个字段的值,并且与 UpdatesColumn 类似,不会影响 "更新时间" 字段。

    db.Model(&user).UpdateColumn("Name", "NewName")
    
  7. SaveSave 方法用于保存(更新)一个模型实例。它会根据模型实例的主键来判断是插入新记录还是更新已有记录。

    db.Save(&user) // 如果 user 已存在,将更新它;否则,将插入一个新记录
    
  8. Updates方法的链式操作:您可以链式操作 Updates 方法,以便在一个操作中更新多个字段:

    db.Model(&user).Updates(User{Name: "NewName"}).Update("Age", 30)
    

请注意,上述示例中的 &user 是要更新的模型实例,您需要传递包含主键的实例或提供主键的条件来标识要更新的记录。

这些是GORM中用于更新数据库记录的一些常见方法和技术。根据您的具体需求,您可以选择适合您的方法来执行更新操作。

删除

GORM 提供了多种方式来执行数据库记录的删除操作,让您可以轻松地从数据库中删除数据。以下是 GORM 中删除功能的介绍:

  1. DeleteDelete 方法用于删除一个模型的记录。您可以传递要删除的模型实例或提供一个条件来删除匹配条件的记录。

    // 删除指定模型实例
    db.Delete(&user)
    
    // 根据条件删除记录
    db.Where("age < ?", 18).Delete(&User{})
    
  2. Unscoped DeleteUnscoped 方法允许您执行硬删除,即删除记录而不考虑 GORM 的软删除设置。通过 Unscoped,您可以永久删除记录,即使记录被标记为已删除也可以。

    // 永久删除记录
    db.Unscoped().Delete(&user)
    
  3. Delete 方法的链式操作:您可以链式操作 Delete 方法,并且可以添加额外的条件来筛选要删除的记录。

    db.Where("name = ?", "John").Delete(&User{})
    
  4. Delete by Primary Key:您可以通过主键来删除记录。

    db.Where("id = ?", 1).Delete(&User{})
    
  5. DeleteAllDeleteAll 方法用于删除一个模型的所有记录,类似于 DELETE FROM table 的操作。

    db.Delete(&User{}) // 删除 User 表的所有记录
    
  6. DeleteColumnDeleteColumn 方法用于删除一个字段的值,通常用于清空一个字段的内容。

    db.Model(&user).UpdateColumn("Name", nil) // 删除 Name 字段的内容
    
  7. DeleteRowsDeleteRows 方法用于删除满足给定条件的记录,类似于 DELETE FROM table WHERE condition 的操作。

    db.Where("age < ?", 18).Delete(&User{})
    
  8. PurgeDeletedPurgeDeleted 方法用于永久删除所有已标记为已删除的记录(软删除记录)。这是软删除的最终清理步骤。

    db.Unscoped().Where("deleted_at IS NOT NULL").PurgeDeleted(&User{})
    

请注意,GORM 支持软删除,即记录不会立即从数据库中删除,而是通过设置一个特殊字段(通常为 deleted_at)来标记为已删除。软删除可以通过 Unscoped 方法来绕过,或者使用 PurgeDeleted 方法来永久删除已删除的记录。

这些是 GORM 中用于删除数据库记录的一些常见方法和技术。根据您的具体需求,您可以选择适合您的方法来执行删除操作。

其余功能暂时没有使用到。