Go Gorm 之 Unscoped()

date
Aug 7, 2023
slug
go-gorm-unscoped-func-use
status
Published
tags
MySQL
Go
PostgreSQL
summary
Gorm Unscoped() 简介
type
Post
Created Time
Oct 28, 2023 01:45 PM
Updated Time
Oct 28, 2023 01:45 PM
AI summary
在 Gorm 中,软删除可以通过定义作用域(scope)来实现。作用域会自动将软删除的记录排除在查询结果之外,以便在正常查询时隐藏这些记录。然而,在某些情况下,你可能需要查询软删除的记录或者需要对软删除的记录执行其他操作。这时,Unscoped() 方法就派上用场了。它允许你移除软删除作用域,从而在查询中包括软删除的记录。Unscope() 方法有两种使用方式:移除全局作用域和移除模型作用域。
Status
在 Gorm 中,软删除是一种常见的数据处理方式,在该方式下,记录并不被真正删除,而是通过标记或其他方式表示为已删除状态。在 GORM 中,软删除可以通过定义作用域(scope)来实现。作用域会自动将软删除的记录排除在查询结果之外,以便在正常查询时隐藏这些记录。然而,在某些情况下,你可能需要查询软删除的记录或者需要对软删除的记录执行其他操作。这时,Unscoped() 方法就派上用场了。它允许你移除软删除作用域,从而在查询中包括软删除的记录。
Unscope() 方法有两种使用方式:
  1. 移除全局作用域:
    1. 当你在 GORM 中定义了全局作用域时,它们会应用于所有查询。但是,有时你可能需要在特定的查询中移除某些全局作用域。这时可以使用 Unscope() 方法来移除这些作用域。
      下面是一个示例,假设你定义了一个全局作用域 SoftDelete,用于将软删除的记录排除在查询结果之外:
      在上面的代码中,Unscoped() 方法移除了 SoftDelete 作用域,并查询了所有的用户记录,包括软删除的记录。
  1. 移除模型作用域:
    1. 在 GORM 中,你可以为模型定义自己的作用域,这些作用域可以应用于模型的所有查询。但是,在某些情况下,你可能需要从特定的查询中移除模型的某个作用域。这时可以使用 Unscope() 方法来移除模型作用域。
      下面是一个示例,假设你有一个 User 模型,它定义了一个作用域 Admin,用于查询管理员用户:
      在上面的代码中,Unscoped() 方法移除了 Admin 作用域,并查询了所有的管理员用户记录,包括被软删除的记录。

      实践

      在某次执行复杂查询时,我发现执行的 SQL 语句出现了没有定义的条件语句:
      其中,"id"."deleted_at" 并不是我期望的,找了一圈,最终发现,其实是 Grom 里默认添加的作用域,最终的解决方式就是在查询时,添加 Unscoped()

© 孙东辉 2022 - 2024