NO-ORMer 请绕道 👉 Golang, ORMs, and why I am still not using one. (hydrogen18.com)。
GORM 原生支持 3 种提示,分别是:
Index Hints
:MySQL 索引提示;Optimizer Hints
:MySQL 优化器提示;Comment Hints
:注释提示,在任意 SQL 关键字之前或之后添加 /* */
块注释。Hints | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
所以 GORM 对 MySQL 的支持很好,然而本人工作中主要使用 SQL Server,其表提示 WITH(...)
会经常使用,所以查看了 GORM Hints 相关代码后,实现了 SQL Server 的 WITH
表提示,代码如下所示:
1package tool
2
3import (
4 "gorm.io/gorm"
5 "gorm.io/gorm/clause"
6 "gorm.io/hints"
7)
8
9// TableHints 自定义 GORM 表提示
10//
11// @Author zixizixi.cn
12type TableHints struct {
13 Type string
14 Keys []string
15}
16
17// ModifyStatement 实现 gorm.StatementModifier 接口方法
18func (tableHint TableHints) ModifyStatement(stmt *gorm.Statement) {
19 for _, name := range []string{"FROM", "INTO"} {
20 stmtClause := stmt.Clauses[name]
21
22 if stmtClause.AfterExpression == nil {
23 stmtClause.AfterExpression = tableHint
24 } else {
25 stmtClause.AfterExpression = hints.Exprs{stmtClause.AfterExpression, tableHint}
26 }
27
28 stmt.Clauses[name] = stmtClause
29 }
30}
31
32// Build 实现 clause.Expression 接口方法
33func (tableHint TableHints) Build(builder clause.Builder) {
34 if len(tableHint.Keys) > 0 {
35 _, _ = builder.WriteString(tableHint.Type)
36 _ = builder.WriteByte('(')
37 for idx, key := range tableHint.Keys {
38 if idx > 0 {
39 _ = builder.WriteByte(',')
40 }
41 _, _ = builder.WriteString(key)
42 }
43 _ = builder.WriteByte(')')
44 }
45}
46
47// With Sql Server 使用 WITH(?) 表提示
48func (tableHint TableHints) With(names ...string) TableHints {
49 return TableHints{Type: "WITH", Keys: names}
50}
51
52// UseNolock Sql Server 使用 WITH(NOLOCK) 表提示
53func (tableHint TableHints) UseNolock() TableHints {
54 return tableHint.With("NOLOCK")
55}
1import (
2 "gorm.io/hints"
3 "tool"
4)
5
6db.Clauses(tool.TableHints{}.UseNolock()).Find(&User{})
7// SELECT * FROM users WITH(NOLOCK)
1import (
2 "gorm.io/hints"
3 "tool"
4)
5
6db.Clauses(tool.TableHints{}.With("NOWAIT")).Find(&User{})
7// SELECT * FROM users WITH(NOWAIT)
8
9db.Clauses(tool.TableHints{}.With("ROWLOCK")).Find(&User{})
10// SELECT * FROM users WITH(ROWLOCK)
2021 年 12 月 25 日发布于 https://zixizixi.cn/golang-gorm-custom-table-hints
内容声明 | |
---|---|
标题: Golang 对象关系映射框架 GORM 实现自定义 SQL 提示 | |
链接: https://zixizixi.cn/golang-gorm-custom-table-hints | 来源: iTanken |
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可,转载请保留此声明。
|