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, deletingrow_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操作,在開始編寫插件之前檢查它們。

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM