Maison > développement back-end > Golang > le corps du texte

CRUD avec Postgres et MongoDB ?

WBOY
Libérer: 2024-02-09 14:00:10
avant
729 Les gens l'ont consulté

使用 Postgres 和 MongoDB 进行 CRUD?

l'éditeur php Xigua vous apprendra comment utiliser Postgres et MongoDB pour effectuer des opérations CRUD dans cet article. Postgres est une base de données relationnelle, tandis que MongoDB est une base de données documentaire. Les opérations CRUD font référence au processus de création (Créer), de lecture (Lecture), de mise à jour (Mise à jour) et de suppression (Supprimer) de données. En combinant ces deux types de bases de données, vous pouvez choisir la base de données la plus adaptée aux opérations de données en fonction de différents besoins afin d'améliorer l'efficacité et la flexibilité. Explorons ensuite l'application de ces deux bases de données dans les opérations CRUD !

Contenu de la question

Je suis assez nouveau sur Go et les backends, et je participe au programme de stages Go. Nous avons construit un CRUD qui se connecte à une base de données psql et maintenant on me dit de me connecter à mongoDB, que nous utiliserons pour le développement et PSQL pour la production. Dois-je créer un nouveau gestionnaire pour mongo à partir de zéro ou puis-je utiliser le même gestionnaire et déterminer d'une manière ou d'une autre le type de base de données utilisée et utiliser la logique en conséquence ? Par exemple, j'ai un gestionnaire pour le point de terminaison d'enregistrement des utilisateurs :

func (ctrl *UserController) Register(c *gin.Context) {
    var user models.User
    if err := c.BindJSON(&user); err != nil {
        c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
            "error":   true,
            "message": err.Error(),
        })
        return
    }
    err := ctrl.userService.Register(&user)
    if err != nil {
        c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{
            "error":   true,
            "message": err.Error(),
        })
        return
    }

    c.JSON(http.StatusCreated, gin.H{
        "message": "successfully created an user",
    })
}

func (svc *UserService) Register(user *models.User) error {
    if svc.userRepo.CheckIfEmailExists(user.Email) {
        return errors.New("user already registered")
    }
    hash, err := svc.generatePasswordHash(user.Password)
    if err != nil {
        return errors.New("err can't register user")
    }

    user.Password = hash

    return svc.userRepo.Insert(user)
}

func (repo *UserRepository) CheckIfEmailExists(mail string) bool {
    var user models.User
    err := repo.dbClient.Debug().Model(models.User{}).Where("email = ?", mail).Find(&user).Error
    return errors.Is(err, gorm.ErrRecordNotFound)
}

func (repo *UserRepository) Insert(user *models.User) error {
    err := repo.dbClient.Debug().Model(models.User{}).Create(user).Error
    if err != nil {
        log.Printf("failed to insert user: %v\n", err)
        return err
    }
    return nil
}
Copier après la connexion

J'ai construit les fonctions d'insertion, d'enregistrement et CheckIfEmailExists pour mongo :

func (repo *UserRepository) InsertInMongo(user *models.UserB) error {
    coll := repo.mongoClient.DB.Collection("users")
    _, err := coll.InsertOne(context.TODO(), user)
    if err != nil {
        log.Printf("failed to insert user: %v\n", err)
        return err
    }
    return nil
}

func (svc *UserService) RegisterToMongo(user *models.UserB) error {
    check := svc.userRepo.CheckIfEmailExistsInMongo(user.Email)
    if check {
        return errors.New("user already registered")
    }
    hash, err := svc.generatePasswordHash(user.Password)
    if err != nil {
        return errors.New("err can't register user")
    }
    user.Password = hash
    return svc.userRepo.InsertInMongo(user)
}

func (repo *UserRepository) CheckIfEmailExistsInMongo(email string) bool {
    coll := repo.mongoClient.Collection
    filter := bson.D{{Key: "email", Value: email}}

    count, err := coll.CountDocuments(context.TODO(), filter)
    if err != nil {
        panic(err)
    }
    if count != 0 {
        return true
    }
    return false
}
Copier après la connexion

Solution de contournement

Vous n'avez pas fourni de code sur la façon de créer UserService.

Idéalement, vous devriez avoir une interface qui ressemble à ceci :

type UserRepository interface {
    CheckIfEmailExists(mail string) bool
    Insert(user *models.User) error
    …
}
Copier après la connexion

Ensuite, le UserService doit être créé comme ceci :

// We use the interface as param
func NewUserService(userRepo UserRepository) UserService {
    return UserService{
        UserRepo: userRepo
    }
}
Copier après la connexion

Et vous aurez deux référentiels distincts, tous deux implémentant l'interface UserRepository - ce qui signifie qu'ils doivent avoir des méthodes avec le même nom et la même signature (paramètres, type de retour) que l'interface :

mongo_user_repository.go

Type MongoUserRepo struct {
    …
}

func (repo MongoUserRepo) CheckIfEmailExists(mail string) bool {
  … some mongo logic here
}

func (repo MongoUserRepo) Insert(user *models.User) error {
  … some mongo logic here
}
Copier après la connexion

postgres_user_repository.go

type PostgresUserRepo struct {
    …
}

func (repo PostgresUserRepo) CheckIfEmailExists(mail string) bool {
  … some postgres logic here
}

func (repo PostgresUserRepo) Insert(user *models.User) error {
  … some postgres logic here
}
Copier après la connexion

Vous pouvez transmettre n'importe lequel de ces éléments en fonction du cas d'utilisation, comme le (très mauvais) exemple ci-dessous :

main.go

…

var userService UserService

if os.Getenv(“environment”) == “prod” {
    userService = NewUserService(postgreUserRepo)
} else if os.Getenv(“environment”) == “dev” {
    userService = NewUserService(mongoUserRepo)
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!