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.
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{}) ...
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... }
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 }
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 }
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!