vault backup: 2026-04-28 20:56:51
This commit is contained in:
+34
-29
@@ -90,8 +90,8 @@ db.Where("id IN (?)", []int{1, 2, 3}).Find(&users)
|
||||
// 批量删除
|
||||
db.Where("id IN (?)", []int{1, 2, 3}).Delete(&User{})
|
||||
|
||||
// NOT IN
|
||||
db.Not("id IN (?)", []int{1, 2, 3}).Find(&users)
|
||||
// NOT IN —— GORM Not 方法接收字段名和切片,自动推断 NOT IN
|
||||
db.Not("id", []int{1, 2, 3}).Find(&users)
|
||||
// SELECT * FROM users WHERE id NOT IN (1, 2, 3);
|
||||
```
|
||||
|
||||
@@ -222,44 +222,49 @@ for rows.Next() {
|
||||
> [!important] 资源管理
|
||||
> `Rows` 对象持有数据库连接,使用完毕后**必须**调用 `rows.Close()`,否则会导致连接泄漏。如果只需要单行结果,优先用 `Raw(...).Scan(&dest)`。
|
||||
|
||||
### Condition 对象(条件复用)
|
||||
### 条件复用(中间态 DB)
|
||||
|
||||
把带条件的查询保存为一个 `*gorm.DB`,后续在不同业务场景上追加不同操作:
|
||||
|
||||
```go
|
||||
cond := gorm.Condition.Where("status = ?", "active").Or("status = ?", "pending")
|
||||
db.Where(cond).Find(&users)
|
||||
// 基础条件:只查活跃数据
|
||||
q := db.Model(&User{}).Where("status = ?", "active")
|
||||
|
||||
// 多个条件组合复用
|
||||
activeCount := db.Model(&User{}).Where(cond).Count()
|
||||
activeUsers := db.Where(cond).Order("created_at DESC").Limit(10).Find(&users)
|
||||
// 统计活跃用户数
|
||||
activeCount := q.Count()
|
||||
|
||||
// 分页查询最新活跃用户
|
||||
activeUsers := make([]User, 0)
|
||||
q.Order("created_at DESC").Limit(10).Find(&activeUsers)
|
||||
```
|
||||
|
||||
> [!tip] 何时使用 Condition 对象?
|
||||
> 当你需要在多个查询中重复使用同一组条件时(比如项目中所有业务模块都要「只查活跃数据」),把它抽成全局 Condition 变量,避免到处复制粘贴 SQL 片段。
|
||||
> [!tip] 何时使用中间态 DB?
|
||||
> 当你需要在多个查询中重复使用同一组条件时(比如项目中所有业务模块都要「只查活跃数据」),先构建好基础查询再分别追加 `Order` / `Limit` / `Select` 等操作,避免到处复制粘贴 SQL 片段。
|
||||
|
||||
## 条件查询决策图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start[收到查询请求] --> Type{条件类型_}
|
||||
Start["收到查询请求"] --> Type{"条件类型"}
|
||||
|
||||
Type --> |精确匹配| Exact["Where(field, value)"]
|
||||
Type --> |范围查询| RangeQ{BETWEEN 还是 _}
|
||||
RangeQ --> |GORM 自带| Between["BETWEEN ? AND ?"]
|
||||
RangeQ --> |自定义> < |=LtGt["where field > ? AND field < ?"]
|
||||
Type --> |集合| SetQ{IN 还是 NOT IN_}
|
||||
SetQ --> |IN| InOp["In field VALUES"]
|
||||
SetQ --> |NOT IN| NotInOp["Not In field VALUES"]
|
||||
Type --> |模糊| LikeQ{前缀/后缀/全匹配_}
|
||||
LikeQ --> |前缀%| PrefixLike["LIKE 'prefix%'"]
|
||||
LikeQ --> |后缀%| SuffixLike["LIKE '%suffix'"]
|
||||
LikeQ --> |全匹配%| FullLike["LIKE '%keyword%'"]
|
||||
Type --> |NULL检查| NullQ{IS NULL 还是 _}
|
||||
NullQ --> |IS NULL|IsNull["IS NULL"]
|
||||
NullQ --> |IS NOT NULL| IsNotNull["IS NOT NULL"]
|
||||
Type --> |复合条件| AndQ{简单AND 还是 OR混合_}
|
||||
AndQ --> |简单AND| SimpleAnd["连续 Where 调用"]
|
||||
AndQ --> |OR混合| OrChain["Where + Or 链式"]
|
||||
Type --> |特殊SQL| Raw["Raw + Expr"]
|
||||
Type --> "精确匹配" --> Exact["Where field, value"]
|
||||
Type --> "范围查询" --> RangeQ{"BETWEEN 还是 GT/LT"}
|
||||
RangeQ --> "GORM 自带" --> Between["BETWEEN ? AND ?"]
|
||||
RangeQ --> "自定义 < >" --> LtGt["field > ? AND field < ?"]
|
||||
Type --> "集合" --> SetQ{"IN 还是 NOT IN"}
|
||||
SetQ --> "IN" --> InOp["In field VALUES"]
|
||||
SetQ --> "NOT IN" --> NotInOp["Not In field VALUES"]
|
||||
Type --> "模糊" --> LikeQ{"前缀/后缀/全匹配"}
|
||||
LikeQ --> "前缀 %" --> PrefixLike["LIKE 'prefix%'"]
|
||||
LikeQ --> "后缀 %" --> SuffixLike["LIKE '%suffix'"]
|
||||
LikeQ --> "全匹配 %" --> FullLike["LIKE '%keyword%'"]
|
||||
Type --> "NULL检查" --> NullQ{"IS NULL 还是 NOT"}
|
||||
NullQ --> "IS NULL" --> IsNullOp["IS NULL"]
|
||||
NullQ --> "IS NOT NULL" --> IsNotNullOp["IS NOT NULL"]
|
||||
Type --> "复合条件" --> AndQ{"简单AND 还是 OR混合"}
|
||||
AndQ --> "简单AND" --> SimpleAnd["连续 Where 调用"]
|
||||
AndQ --> "OR混合" --> OrChain["Where + Or 链式"]
|
||||
Type --> "特殊SQL" --> Raw["Raw + Expr"]
|
||||
|
||||
style Start fill:#4FC08D,color:#fff
|
||||
style Exact fill:#3B82F6,color:#fff
|
||||
|
||||
Reference in New Issue
Block a user