Rumah  >  Artikel  >  pembangunan bahagian belakang  >  CRUD dengan Postgres dan MongoDB?

CRUD dengan Postgres dan MongoDB?

WBOY
WBOYke hadapan
2024-02-09 14:00:10731semak imbas

使用 Postgres 和 MongoDB 进行 CRUD?

editor php Xigua akan mengajar anda cara menggunakan Postgres dan MongoDB untuk melaksanakan operasi CRUD dalam artikel ini. Postgres ialah pangkalan data hubungan, manakala MongoDB ialah pangkalan data dokumen. Operasi CRUD merujuk kepada proses mencipta (Buat), membaca (Baca), mengemas kini (Kemas kini) dan memadam (Padam) data. Dengan menggabungkan dua jenis pangkalan data yang berbeza ini, anda boleh memilih pangkalan data yang paling sesuai untuk operasi data berdasarkan keperluan yang berbeza untuk meningkatkan kecekapan dan fleksibiliti. Seterusnya, mari kita meneroka aplikasi kedua-dua pangkalan data ini dalam operasi CRUD!

Kandungan soalan

Saya agak baru dalam Go dan backends, dan saya mengambil bahagian dalam program latihan Go. Kami membina CRUD yang menyambung ke pangkalan data psql dan kini saya diberitahu untuk menyambung ke mongoDB, yang akan kami gunakan untuk pembangunan dan PSQL akan digunakan untuk pengeluaran. Adakah saya perlu mencipta pengendali baharu untuk mongo dari awal atau bolehkah saya menggunakan pengendali yang sama dan entah bagaimana menentukan jenis pangkalan data yang digunakan dan menggunakan logik dengan sewajarnya? Sebagai contoh, saya mempunyai pengendali untuk titik akhir pendaftaran pengguna:

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
}

Saya membina fungsi sisipan, daftar dan CheckIfEmailExists untuk 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
}

Penyelesaian

Anda tidak memberikan kod tentang cara membuat UserService.

Sebaik-baiknya, anda harus mempunyai antara muka yang kelihatan seperti ini:

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

Kemudian UserService harus dibuat seperti ini:

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

Dan anda akan mempunyai dua repositori berasingan, kedua-duanya melaksanakan antara muka UserRepository - bermakna mereka harus mempunyai kaedah dengan nama yang sama dan tandatangan yang sama (parameter, jenis pulangan) sebagai antara muka:

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
}

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
}

Anda boleh lulus mana-mana ini bergantung pada kes penggunaan, seperti contoh (sangat teruk) di bawah:

main.go

…

var userService UserService

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

Atas ialah kandungan terperinci CRUD dengan Postgres dan MongoDB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam