何時是使用 GORM 來運行 Automigrate 的最佳時機
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...
