php小編柚子今天為大家分享關於 GORM 運行 Automigrate 的最佳時機。 GORM 是一個強大的Go語言ORM庫,可以簡化資料庫操作。 Automigrate 是GORM提供的自動遷移工具,可根據模型定義自動產生資料庫表結構。那麼何時是使用 GORM 來執行 Automigrate 的最佳時機呢?讓我們一起來探討一下。
我見過的大多數 go/gorm 範例都顯示在開啟資料庫連線後立即呼叫 automigrate,包括此處的 gorm 文件。對於 api 服務,這對於每個 api 請求來說都是一個昂貴/需要的呼叫。因此,我認為,對於 api 服務,應將 automigrate 從常規流程中刪除並單獨處理。我的理解正確嗎?
來自 gorm 文檔
... db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") } // Migrate the schema db.AutoMigrate(&Product{}) ...
並不是每個 api 請求都會發生這種情況。差遠了。每次啟動應用程式時都會發生這種情況,所以基本上:連接到 main
中的資料庫,並在那裡運行 automigrate
。將連線作為依賴項傳遞給您的處理程序/服務包/任何您需要的地方。 http 處理程序可以在那裡存取它。
基本上是這樣的:
package main func main() { db, err := gorm.open(sqlite.open("test.db"), &gorm.config{}) if err != nil { fmt.printf("failed to connect to db: %v", err) os.exit(1) } // see below how this is handled frepo := foo.new(db) // all repos here frepo.migrate() // this handles migrations // create request handlers fhandler := handlers.newfoo(frepo) // migrations have already been handled mux := http.newservemux() mux.handlefunc("/foo/list", fhandler.list) // set up handlers // start server etc... }
在某個套件中包含與資料庫互動的程式碼,如下所示:
package foo // the db connection interface as you use it type connection interface { create() find() automigrate(any) } type foo struct { db connection } func new(db connection) *foo { return &foo{ db: db, } } func (f *foo) migrate() { f.db.automigrate(&stuff{}) // all types this repo deals with go here } func (f *foo) getall() ([]stuff, error) { ret := []stuff{} res := f.db.find(&ret) return ret, res.error }
然後以合理的方式建立您的處理程序,並向它們提供儲存庫(又稱為 foo 套件內容):
package handlers type FooRepo interface { GetAll() ([]Stuff, error) } type FooHandler struct { repo FooRepo } func NewFoo(repo FooRepo) *FooHandler { return &FooHandler{ repo: repo, } } func (f *FooHandler) List(res http.ResponseWriter, req *http.Request) { all, err := f.repo.GetAll() if err != nil { res.WriteHeader(http.StatusInternalServerError) io.WriteString(w, err.Error()) return } // write response as needed }
每當您部署應用程式的更新版本時,main
函數都會呼叫automigrate
,並且應用程式將處理請求,而無需不斷地重新連接到資料庫或一次又一次嘗試處理遷移。
我不知道為什麼您認為您的應用程式必須運行每個請求的設置,特別是考慮到您的main 函數(或從main
呼叫的某些函數)明確創建了一個http 伺服器並偵聽在請求的特定連接埠上。在開始偵聽請求之前,應處理資料庫連線和後續遷移。它不是處理請求的一部分,永遠...
以上是何時是使用 GORM 來運行 Automigrate 的最佳時機的詳細內容。更多資訊請關注PHP中文網其他相關文章!