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语言kube-scheduler深度剖析与开发之pod调度

    Go语言kube-scheduler深度剖析与开发之pod调度

    这篇文章主要为大家介绍了Go语言kube-scheduler深度剖析与开发,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • go语言面试如何实现自旋锁?

    go语言面试如何实现自旋锁?

    这篇文章主要为大家介绍了go语言面试中常问的如何实现自旋锁问题实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 在go语言中安装与使用protobuf的方法详解

    在go语言中安装与使用protobuf的方法详解

    protobuf以前只支持C++, Python和Java等语言, Go语言出来后, 作为亲儿子, 那有不支持的道理呢? 这篇文章主要给大家介绍了关于在go语言中使用protobuf的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Go实现整合Logrus实现日志打印

    Go实现整合Logrus实现日志打印

    这篇文章主要介绍了Go实现整合Logrus实现日志打印,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Go语言指针使用分析与讲解

    Go语言指针使用分析与讲解

    这篇文章主要介绍了Go语言指针使用分析与讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • GO语言函数(func)的声明与使用详解

    GO语言函数(func)的声明与使用详解

    这篇文章主要介绍了GO函数(func)的声明与使用,包括了GO语言函数声明与使用,GO语言递归函数,GO语言内置函数,GO语言函数defer应用,GO语言函数可变长度参数需要的朋友可以参考下
    2022-12-12
  • 详解Go sync 同步原语

    详解Go sync 同步原语

    Go 中不仅有 channel 这种 CSP 同步机制,还有 sync.Mutex、sync.WaitGroup 等比较原始的同步原语,使用它们,可以更灵活的控制数据同步和多协程并发,这篇文章主要介绍了Go sync 同步原语,需要的朋友可以参考下
    2023-12-12
  • grpc入门Unary模式使用方法示例教程

    grpc入门Unary模式使用方法示例教程

    这篇文章主要为大家介绍了grpc入门Unary模式使用方法示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 使用golang实现在屏幕上打印进度条的操作

    使用golang实现在屏幕上打印进度条的操作

    这篇文章主要介绍了使用golang实现在屏幕上打印进度条的操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Go语言如何实现TCP通信详解

    Go语言如何实现TCP通信详解

    go里面实现tcp没有像之前写的C++那些那么麻烦,在C++里面要先创建套接字,然后绑定ip地址,go里面直接就一个函数建立套接字,然后在进行通信就可以了,下面这篇文章主要给大家介绍了关于Go语言如何实现TCP通信的相关资料,需要的朋友可以参考下
    2023-01-01

最新评论