golang gorm开发架构及写插件示例

 更新时间:2022年04月15日 17:15:05   作者:Jeff的技术栈  
这篇文章主要为大家介绍了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)

并且基于当前操作的类型,它将调用注册的creatingupdatingqueryingdeletingrow_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将在运行RowRows时被调用,默认情况下没有注册的回调,你可以注册一个新的回调:

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)

以上就是golang gorm开发架构及写插件示例的详细内容,更多关于golang gorm开发架构写插件的资料请关注脚本之家其它相关文章!

相关文章

  • Go runtime 调度器之系统调用引起的抢占

    Go runtime 调度器之系统调用引起的抢占

    本文解析了在Go语言中,当goroutine执行的系统调用时间过长时,系统如何通过监控和抢占机制来处理,以维持运行效率和资源分配的平衡,通过具体的示例和流程图,详细展示了系统调用过程中的抢占操作,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • VSCode1.4 搭建Golang的开发调试环境(遇到很多问题)

    VSCode1.4 搭建Golang的开发调试环境(遇到很多问题)

    这篇文章主要介绍了VSCode1.4 搭建Golang的开发调试环境(遇到很多问题),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解

    在计算机科学中,stack(栈)是一种基本的数据结构,它是一种线性结构,具有后进先出(Last In First Out)的特点。本文将通过Golang实现堆栈,需要的可以参考一下
    2023-04-04
  • 盘点几种Go语言开发的IDE

    盘点几种Go语言开发的IDE

    Go语言作为一种新兴的编程语言,近年来受到了越来越多的关注,它以其简洁、高效和并发性能而闻名,被广泛应用于各种软件开发项目中,本文将介绍几种常用的Go语言IDE,并对它们进行比较,帮助开发者根据自己的需求选择合适的工具,需要的朋友可以参考下
    2023-11-11
  • Go语言并发控制之semaphore的原理与使用

    Go语言并发控制之semaphore的原理与使用

    这篇文章主要为大家详细介绍了Go官方库x中提供的扩展并发原语 semaphore,译为“信号量”,文中介绍了它的原理与使用,需要的可以了解下
    2025-02-02
  • 详解Golang中channel的实现

    详解Golang中channel的实现

    channel俗称管道,用于数据传递或数据共享,其本质是一个先进先出的队列,使用goroutine+channel进行数据通讯简单高效,同时也线程安全,本文就给大家讲讲Golang中channel的实现,需要的朋友可以参考下
    2023-09-09
  • Golang反射获取结构体的值和修改值的代码示例

    Golang反射获取结构体的值和修改值的代码示例

    这篇文章主要给大家介绍了golang反射获取结构体的值和修改值的代码示例及演示效果,对我们的学习或工作有一定的帮助,感兴趣的同学可以参考阅读本文
    2023-08-08
  • 一文带你学会Go select语句轻松实现高效并发

    一文带你学会Go select语句轻松实现高效并发

    这篇文章主要为大家详细介绍了Golang中select语句的用法,文中的示例代码讲解详细,对我们学习Golang有一定的帮助,需要的可以参考一下
    2023-03-03
  • Skywalking-go自动监控增强使用探究

    Skywalking-go自动监控增强使用探究

    这篇文章主要介绍了Skywalking-go自动监控增强使用深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • go语言代码生成器code generator使用示例介绍

    go语言代码生成器code generator使用示例介绍

    这篇文章主要为大家介绍了go语言代码生成器code generator的使用简单介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论