Golang 对象关系映射框架 GORM 实现自定义 SQL 提示

子兮子兮 No can, but will. 本文由博客端 https://zixizixi.cn 主动推送

NO-ORMer 请绕道 👉 Golang, ORMs, and why I am still not using one. (hydrogen18.com)

GORM 原生支持 3 种提示,分别是:

Hints | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

所以 GORM 对 MySQL 的支持很好,然而本人工作中主要使用 SQL Server,其表提示 WITH(...) 会经常使用,所以查看了 GORM Hints 相关代码后,实现了 SQL Server 的 WITH 表提示,代码如下所示:

TableHints.go

package tool

import (
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/hints"
)

// TableHints 自定义 GORM 表提示
//
// @Author zixizixi.cn
type TableHints struct {
	Type string
	Keys []string
}

// ModifyStatement 实现 gorm.StatementModifier 接口方法
func (tableHint TableHints) ModifyStatement(stmt *gorm.Statement) {
	for _, name := range []string{"FROM", "INTO"} {
		stmtClause := stmt.Clauses[name]

		if stmtClause.AfterExpression == nil {
			stmtClause.AfterExpression = tableHint
		} else {
			stmtClause.AfterExpression = hints.Exprs{stmtClause.AfterExpression, tableHint}
		}

		stmt.Clauses[name] = stmtClause
	}
}

// Build 实现 clause.Expression 接口方法
func (tableHint TableHints) Build(builder clause.Builder) {
	if len(tableHint.Keys) > 0 {
		_, _ = builder.WriteString(tableHint.Type)
		_ = builder.WriteByte('(')
		for idx, key := range tableHint.Keys {
			if idx > 0 {
				_ = builder.WriteByte(',')
			}
			_, _ = builder.WriteString(key)
		}
		_ = builder.WriteByte(')')
	}
}

// With Sql Server 使用 WITH(?) 表提示
func (tableHint TableHints) With(names ...string) TableHints {
	return TableHints{Type: "WITH", Keys: names}
}

// UseWithNolock Sql Server 使用 WITH(NOLOCK) 表提示
func (tableHint TableHints) UseWithNolock() TableHints {
	return tableHint.With("NOLOCK")
}

Usage

import (
    "gorm.io/hints"
    "tool"
)

db.Clauses(tool.TableHints{}.UseWithNolock()).Find(&User{})
// SELECT * FROM users WITH(NOLOCK)
import (
    "gorm.io/hints"
    "tool"
)

db.Clauses(tool.TableHints{}.With("NOWAIT")).Find(&User{})
// SELECT * FROM users WITH(NOWAIT)

db.Clauses(tool.TableHints{}.With("ROWLOCK")).Find(&User{})
// SELECT * FROM users WITH(ROWLOCK)

2021 年 12 月 25 日一个人发布于 https://zixizixi.cn/golang-gorm-custom-table-hints

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    478 引用 • 1378 回帖 • 582 关注
  • GORM
    7 引用 • 19 回帖
  • SQL
    117 引用 • 290 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...