首頁  >  文章  >  後端開發  >  何時是使用 GORM 來運行 Automigrate 的最佳時機

何時是使用 GORM 來運行 Automigrate 的最佳時機

WBOY
WBOY轉載
2024-02-08 22:24:34997瀏覽

何时是使用 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除