Heim > Backend-Entwicklung > Golang > CRUD mit Postgres und MongoDB?

CRUD mit Postgres und MongoDB?

WBOY
Freigeben: 2024-02-09 14:00:10
nach vorne
761 Leute haben es durchsucht

使用 Postgres 和 MongoDB 进行 CRUD?

php-Editor Xigua zeigt Ihnen in diesem Artikel, wie Sie Postgres und MongoDB verwenden, um CRUD-Operationen durchzuführen. Postgres ist eine relationale Datenbank, während MongoDB eine Dokumentendatenbank ist. CRUD-Operationen beziehen sich auf den Prozess des Erstellens (Create), Lesens (Read), Aktualisierens (Update) und Löschens (Delete) von Daten. Durch die Kombination dieser beiden unterschiedlichen Datenbanktypen können Sie basierend auf unterschiedlichen Anforderungen die am besten geeignete Datenbank für Datenoperationen auswählen, um die Effizienz und Flexibilität zu verbessern. Lassen Sie uns als Nächstes die Anwendung dieser beiden Datenbanken in CRUD-Operationen untersuchen!

Frageninhalt

Ich bin ziemlich neu in Go und Backends und nehme am Go-Praktikumsprogramm teil. Wir haben ein CRUD erstellt, das eine Verbindung zu einer psql-Datenbank herstellt, und jetzt wird mir gesagt, ich solle eine Verbindung zu mongoDB herstellen, das wir für die Entwicklung und PSQL für die Produktion verwenden werden. Muss ich einen neuen Handler für Mongo von Grund auf erstellen oder kann ich denselben Handler verwenden und irgendwie den Typ der verwendeten Datenbank bestimmen und die Logik entsprechend verwenden? Ich habe zum Beispiel einen Handler für den Benutzerregistrierungsendpunkt:

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
}
Nach dem Login kopieren

Ich habe die Funktionen insert, register und CheckIfEmailExists für Mongo erstellt:

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
}
Nach dem Login kopieren

Workaround

Sie haben keinen Code zum Erstellen eines UserService bereitgestellt.

Idealerweise sollten Sie eine Schnittstelle haben, die so aussieht:

type UserRepository interface {
    CheckIfEmailExists(mail string) bool
    Insert(user *models.User) error
    …
}
Nach dem Login kopieren

Dann sollte der UserService wie folgt erstellt werden:

// We use the interface as param
func NewUserService(userRepo UserRepository) UserService {
    return UserService{
        UserRepo: userRepo
    }
}
Nach dem Login kopieren

Und Sie haben zwei separate Repositorys, die beide die UserRepository-Schnittstelle implementieren – das heißt, sie sollten Methoden mit demselben Namen und derselben Signatur (Parameter, Rückgabetyp) wie die Schnittstelle haben:

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

Sie können je nach Anwendungsfall jedes davon weitergeben, wie das (sehr schlechte) Beispiel unten:

main.go

…

var userService UserService

if os.Getenv(“environment”) == “prod” {
    userService = NewUserService(postgreUserRepo)
} else if os.Getenv(“environment”) == “dev” {
    userService = NewUserService(mongoUserRepo)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonCRUD mit Postgres und MongoDB?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage