Go 语言基础(24) | 青训营笔记

71 阅读1分钟

GORM 设计原理

flowchart LR
    n1[应用程序] -.-> n2[GORM]
    subgraph 应用程序视角的数据库
    n2 -- 操作接口 --> n3[database/sql] -- 连接接口 --> n4[数据库]
    n3 -- 操作接口 --> n4
    end

SQL 是怎么生成的

一个简单的 SQL 语句(statement)如下:

SELECT `name`, `age`, `employee_number`

FROM `users`

WHERE 
  role <> "manager" AND
  age > 35

ORDER BY age DESC

LIMIT 10 OFFSET 10

FOR UPDATE

里面有 SELECTFROMWHEREORDER BYLIMITFOR 等从句,然后 WHERE 从句里面有两个表达式。

等效的 GORM 语句如下:

db.Where("role <> ?", "manager").Where("age > ?", 35).Limit(100).Order("age desc").Find(&user)

来逐块分析这个语句:

flowchart TD
    start[db]
    subgraph cm1["ChainMethod1: .Where"]
    cm1args[''role <> ?'', ''manager'']
    end
    subgraph cm2["ChainMethod2: .Where"]
    cm2args[''age > ?'', 35]
    end
    subgraph cm3["ChainMethod3: .Limit"]
    cm3args[100]
    end
    subgraph cm4["ChainMethod4: .Order"]
    cm4args[''age desc'']
    end
    subgraph fm["FinisherMethod: .Find"]
    fmargs[&user]
    end
    
    start --> cm1 --> cm2 --> cm3 --> cm4 --> fm
    
    subgraph clauses["GORM Clauses"]
    cm1
    cm2
    cm3
    cm4
    end
    
    subgraph clause["决定类型 & 执行"]
    fm
    end
    
    subgraph "SELECT Statement"
    clauses
    clause
    end