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
里面有 SELECT,FROM,WHERE,ORDER BY,LIMIT,FOR 等从句,然后 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