golang?gorm開發(fā)架構及寫插件示例
1. 開發(fā)
1.1. 架構
Gorm使用可鏈接的API,*gorm.DB是鏈的橋梁,對于每個鏈API,它將創(chuàng)建一個新的關系。
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
// 創(chuàng)建新關系
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)
}
當我們開始執(zhí)行任何操作時,GORM將基于當前的*gorm.DB創(chuàng)建一個新的*gorm.Scope實例
// 執(zhí)行查詢操作 db.First(&user)
并且基于當前操作的類型,它將調用注冊的creating, updating, querying, deleting或row_querying回調來運行操作。
對于上面的例子,將調用querying,參考查詢回調
1.2. 寫插件
GORM本身由Callbacks提供支持,因此您可以根據(jù)需要完全自定義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. 刪除現(xiàn)有的callback
db.Callback().Create().Remove("gorm:create")
// 從Create回調中刪除`gorm:create`回調
1.2.3. 替換現(xiàn)有的callback
db.Callback().Create().Replace("gorm:create", newCreateFunction)
// 使用新函數(shù)`newCreateFunction`替換回調`gorm:create`用于創(chuàng)建過程
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定義了回調以執(zhí)行其CRUD操作,在開始編寫插件之前檢查它們。
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)以上就是golang gorm開發(fā)架構及寫插件示例的詳細內容,更多關于golang gorm開發(fā)架構寫插件的資料請關注腳本之家其它相關文章!
相關文章
Go?runtime?調度器之系統(tǒng)調用引起的搶占
本文解析了在Go語言中,當goroutine執(zhí)行的系統(tǒng)調用時間過長時,系統(tǒng)如何通過監(jiān)控和搶占機制來處理,以維持運行效率和資源分配的平衡,通過具體的示例和流程圖,詳細展示了系統(tǒng)調用過程中的搶占操作,感興趣的朋友跟隨小編一起看看吧2024-09-09
VSCode1.4 搭建Golang的開發(fā)調試環(huán)境(遇到很多問題)
這篇文章主要介紹了VSCode1.4 搭建Golang的開發(fā)調試環(huán)境(遇到很多問題),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
Golang實現(xiàn)數(shù)據(jù)結構Stack(堆棧)的示例詳解
在計算機科學中,stack(棧)是一種基本的數(shù)據(jù)結構,它是一種線性結構,具有后進先出(Last In First Out)的特點。本文將通過Golang實現(xiàn)堆棧,需要的可以參考一下2023-04-04
一文帶你學會Go?select語句輕松實現(xiàn)高效并發(fā)
這篇文章主要為大家詳細介紹了Golang中select語句的用法,文中的示例代碼講解詳細,對我們學習Golang有一定的幫助,需要的可以參考一下2023-03-03

