網站首頁 編程語言 正文
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
相關推薦
- 2022-03-30 Android用動畫顯示或隱藏視圖_Android
- 2022-05-15 Qt中QPixmap、QImage、QPicture、QBitmap四者區別詳解_C 語言
- 2022-07-24 .Net行為型設計模式之中介者模式(Mediator)_基礎應用
- 2023-06-19 scrapy?遠程登錄控制臺的實現_python
- 2022-12-07 C++中的類成員函數當線程函數_C 語言
- 2022-04-09 在Mybatis中使用自定義緩存ehcache
- 2022-08-04 Go?slice切片使用示例詳解_Golang
- 2022-04-24 python使用技巧-查找文件?_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支