Bilakah masa terbaik untuk menjalankan Automigrate dengan GORM

WBOY
Lepaskan: 2024-02-08 22:24:34
ke hadapan
997 orang telah melayarinya

何时是使用 GORM 运行 Automigrate 的最佳时机

editor php Yuzi akan berkongsi dengan anda hari ini masa terbaik untuk menjalankan Automigrate pada GORM. GORM ialah perpustakaan ORM bahasa Go yang berkuasa yang boleh memudahkan operasi pangkalan data. Automigrate ialah alat migrasi automatik yang disediakan oleh GORM, yang boleh menjana struktur jadual pangkalan data secara automatik berdasarkan definisi model. Jadi bilakah masa terbaik untuk menjalankan Automigrate dengan GORM? Mari kita terokai bersama-sama.

Kandungan soalan

Kebanyakan contoh go/gorm yang saya lihat menunjukkan panggilan automigrate serta-merta selepas membuka sambungan pangkalan data, termasuk dokumentasi gorm di sini. Untuk perkhidmatan api, ini adalah panggilan mahal/diperlukan untuk setiap permintaan api. Jadi, saya fikir, untuk perkhidmatan api, automigrate harus dialih keluar daripada proses biasa dan dikendalikan secara berasingan. Adakah pemahaman saya betul?

Dari dokumentasi 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{})
...
Salin selepas log masuk

Penyelesaian

Ini tidak berlaku dengan setiap permintaan api. Tak dekat pun. Ini berlaku setiap kali apl dilancarkan, jadi pada asasnya: sambung ke main 中的数据库,并在那里运行 automigrate . Lulus sambungan sebagai pergantungan kepada pengendali/pakej perkhidmatan anda/apa sahaja yang anda perlukan. Pengendali http boleh mengaksesnya di sana.

Pada asasnya ia seperti ini:

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...
}
Salin selepas log masuk

Sertakan kod untuk berinteraksi dengan pangkalan data dalam pakej, seperti ini:

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
}
Salin selepas log masuk

Kemudian susunkan pengendali anda dengan cara yang munasabah dan berikan mereka repositori (kandungan pakej aka 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
}
Salin selepas log masuk

Setiap kali anda menggunakan versi aplikasi anda yang dikemas kini, main 函数都会调用 automigrate, dan aplikasi akan mengendalikan permintaan tersebut tanpa perlu sentiasa menyambung semula ke pangkalan data atau cuba mengendalikan pemindahan berulang kali.

Saya tidak pasti mengapa anda fikir aplikasi anda perlu menjalankan persediaan setiap permintaan, terutamanya memandangkan fungsi utama anda (atau beberapa fungsi dipanggil daripada main) secara eksplisit mencipta pelayan http dan mendengar permintaan pada port tertentu. Sebelum mula mendengar permintaan, sambungan pangkalan data dan migrasi seterusnya harus dikendalikan. Ia bukan sebahagian daripada mengendalikan permintaan, pernah...

Atas ialah kandungan terperinci Bilakah masa terbaik untuk menjalankan Automigrate dengan GORM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!