golang gorm开发架构及写插件示例
作者:Jeff的技术栈 发布时间:2024-04-25 13:19:00
标签:golang,gorm,开发架构,写插件
1. 开发
1.1. 架构
Gorm使用可链接的API,*gorm.DB
是链的桥梁,对于每个链API,它将创建一个新的关系。
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
// 创建新关系
db = db.Where("name = ?", "jinzhu")
// 过滤更多
if SomeCondition {
db = db.Where("age = ?", 20)
} else {
db = db.Where("age = ?", 30)
}
if YetAnotherCondition {
db = db.Where("active = ?", 1)
}
当我们开始执行任何操作时,GORM将基于当前的*gorm.DB
创建一个新的*gorm.Scope
实例
// 执行查询操作
db.First(&user)
并且基于当前操作的类型,它将调用注册的creating
, updating
, querying
, deleting
或row_querying
回调来运行操作。
对于上面的例子,将调用querying
,参考查询回调
1.2. 写插件
GORM本身由Callbacks
提供支持,因此您可以根据需要完全自定义GORM
1.2.1. 注册新的callback
func updateCreated(scope *Scope) {
if scope.HasColumn("Created") {
scope.SetColumn("Created", NowFunc())
}
}
db.Callback().Create().Register("update_created_at", updateCreated)
// 注册Create进程的回调
1.2.2. 删除现有的callback
db.Callback().Create().Remove("gorm:create")
// 从Create回调中删除`gorm:create`回调
1.2.3. 替换现有的callback
db.Callback().Create().Replace("gorm:create", newCreateFunction)
// 使用新函数`newCreateFunction`替换回调`gorm:create`用于创建过程
1.2.4. 注册callback顺序
db.Callback().Create().Before("gorm:create").Register("update_created_at", updateCreated)
db.Callback().Create().After("gorm:create").Register("update_created_at", updateCreated)
db.Callback().Query().After("gorm:query").Register("my_plugin:after_query", afterQuery)
db.Callback().Delete().After("gorm:delete").Register("my_plugin:after_delete", afterDelete)
db.Callback().Update().Before("gorm:update").Register("my_plugin:before_update", beforeUpdate)
db.Callback().Create().Before("gorm:create").After("gorm:before_create").Register("my_plugin:before_create", beforeCreate)
1.2.5. 预定义回调
GORM定义了回调以执行其CRUD操作,在开始编写插件之前检查它们。
Create callbacks
Update callbacks
Query callbacks
Delete callbacks
Row Query callbacks Row Query callbacks将在运行Row
或Rows
时被调用,默认情况下没有注册的回调,你可以注册一个新的回调:
func updateTableName(scope *gorm.Scope) {
scope.Search.Table(scope.TableName() + "_draft") // append `_draft` to table name
}
db.Callback().RowQuery().Register("publish:update_table_name", updateTableName)
来源:https://www.cnblogs.com/guyouyin123/p/14115493.html
0
投稿
猜你喜欢
- 复制代码CREATE FUNCTION fGetStrBySplit ( @Source VARCHAR(max), @Index INT,
- python绘图的包大家应该不会陌生,但是,对图的常规设置不一定会知道(其实自己也是才知道的),比如:坐标轴的字体大小、颜色设置;标题的字体
- 1. 前言CASE 表达式是从 SQL-92 标准开始被引入的。在 CASE 表达式里,可以使用 BETWEEN 、LIKE和 < 、
- 随笔:(1) 命名空间  
- sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了,今天到数据库
- 首先看一下我的基本的开发环境:操作系统:MacOS 10.13.5编辑器:IDEA 2018.3其他:MySQL8.0.15、Maven 3
- 实现思路很多网站都有拼图验证码1.首先要了解拼图验证码的生成原理2.制定破解计划,考虑其可能性和成功率。3.编写脚本很多网站的拼图验证码都是
- 同由其他技术驱动的应用一样,在相同的Web服务器上运行Django应用也是可行的。 最简单直接的办法就是利用Apaches配置文件httpd
- Python编程中经常遇到一些莫名其妙的错误, 其实这不是语言本身的问题, 而是我们忽略了语言本身的一些特性导致的,今天就来看下使用Pyth
- Function Comma(str)If Not(IsNumeric(str)) Or 
- 回调函数用起来比较爽。特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢下面贴一个我写的例子class
- 随着访问量的增加,对于一些比较耗时的数据库读取操作,一般采用将写入与读取操作分开来缓解数据库的压力,数据库引擎一般采用Master/Slav
- Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list, tuple, d
- 本来想把之前对artTemplate源码解析的注释放上来分享下,不过隔了一年,找不到了,只好把当时分析模板引擎原理后,自己尝试写下的模板引擎
- 默认情况下,SQL Server 保存 7 个 ErrorLog 文件,名为: ErrorLog ErrorLog.1 ErrorLog.2
- 为了实现Nao机器人与电脑端的TCP通信,于是研究了一下Python实现TCP通信,在网上也看到了很多例子,但大多都是在一台机器上验证。在两
- 背景:在pycharm中运行正常,但是使用命令方式就提示没有模块解决方案在Python安装目录下的\Lib\site-packages文件夹
- 一、前言在之前找工作过程中,面试时经常被问到会不会python,懂不懂正则表达式。心里想:软件的东西和芯片设计有什么关系?咱也不知道因为啥用
- 前言最近在开发行为验证码,经常触及到关于验证类型的相关内容。但使用起来不太熟练,闲暇之余,总结一下我对行为验证码验证类型的理解。验证类型概述
- 第一:mysql服务的启动和停止net stop mysqlnet start mysql第二:登陆mysql –u用户名 [–h主机名或者