子兮子兮 子兮子兮

子兮子兮风兮寒,三江七泽情洄沿。

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

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

本文最后更新于 998 天前,内容可能已经不够准确,请酌情参考!

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 表提示,代码如下所示:

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} } // UseNolock Sql Server 使用 WITH(NOLOCK) 表提示 func (tableHint TableHints) UseNolock() TableHints { return tableHint.With("NOLOCK") }

Usage

  • WITH(NOLOCK) 脏读表提示
import ( "gorm.io/hints" "tool" ) db.Clauses(tool.TableHints{}.UseNolock()).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