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