Maison >développement back-end >Golang >Quel est le meilleur moment pour exécuter Automigrate avec GORM

Quel est le meilleur moment pour exécuter Automigrate avec GORM

WBOY
WBOYavant
2024-02-08 22:24:341049parcourir

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

L'éditeur php Yuzi partagera avec vous aujourd'hui le meilleur moment pour exécuter Automigrate sur GORM. GORM est une puissante bibliothèque ORM en langage Go qui peut simplifier les opérations de base de données. Automigrate est un outil de migration automatique fourni par GORM, qui peut générer automatiquement des structures de tables de base de données basées sur les définitions de modèles. Alors, quel est le meilleur moment pour exécuter Automigrate avec GORM ? Explorons-le ensemble.

Contenu de la question

La plupart des exemples go/gorm que j'ai vus montrent l'appel d'automigrate immédiatement après l'ouverture d'une connexion à une base de données, y compris la documentation gorm ici. Pour les services API, il s'agit d'un appel coûteux/obligatoire pour chaque demande d'API. Donc, je pense que pour les services API, la migration automatique devrait être supprimée du processus régulier et traitée séparément. Ma compréhension est-elle correcte ?

De la documentation 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{})
...

Solution de contournement

Cela ne se produit pas avec chaque demande d'API. Même pas proche. Cela se produit à chaque lancement de l'application, donc en gros : connectez-vous à main 中的数据库,并在那里运行 automigrate . Transmettez la connexion en tant que dépendance à votre gestionnaire/package de services/tout ce dont vous avez besoin. Le gestionnaire http peut y accéder.

En gros, c'est comme ça :

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...
}

Incluez le code pour interagir avec la base de données dans un package, comme ceci :

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
}

Structurez ensuite vos gestionnaires de manière judicieuse et fournissez-leur le référentiel (c'est-à-dire le contenu du package 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
}

Chaque fois que vous déployez une version mise à jour de votre application, main 函数都会调用 automigrate, l'application traitera la demande sans avoir à se reconnecter constamment à la base de données ou à essayer de gérer la migration encore et encore.

Je ne sais pas pourquoi vous pensez que votre application doit exécuter une configuration par requête, d'autant plus que votre fonction principale (ou une fonction appelée depuis main) crée explicitement un serveur http et écoute les requêtes sur un port spécifique. Avant de commencer à écouter les demandes, la connexion à la base de données et les migrations ultérieures doivent être gérées. Cela ne fait jamais partie du traitement de la demande...

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer