php小編西瓜在本文中將帶您了解如何使用Postgres和MongoDB進行CRUD作業。 Postgres是一種關聯式資料庫,而MongoDB則是一種文檔型資料庫。 CRUD操作指的是建立(Create)、讀取(Read)、更新(Update)和刪除(Delete)資料的過程。透過結合這兩種不同類型的資料庫,您可以根據不同的需求選擇最適合的資料庫進行資料操作,以提高效率和靈活性。接下來,讓我們一起來探索這兩種資料庫在CRUD操作中的應用吧!
我對 Go 和後端還很陌生,並且正在參加 Go 實習計畫。我們建立了一個連接到 psql 資料庫的 CRUD,現在我被告知連接 mongoDB,我們將其用於開發,而 PSQL 將用於生產。 我是否必須從頭開始創建用於 mongo 的新處理程序,或者我可以使用相同的處理程序並以某種方式確定正在使用的資料庫類型並相應地使用相應的邏輯嗎? 例如,我有一個用於用戶註冊端點的處理程序:
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 }
我為 mongo 建立了插入、註冊和 CheckIfEmailExists 函數:
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 }
您沒有提供如何建立 UserService 的程式碼。
理想情況下,您應該有一個如下所示的介面:
type UserRepository interface { CheckIfEmailExists(mail string) bool Insert(user *models.User) error … }
然後,UserService 應該要這樣建立:
// We use the interface as param func NewUserService(userRepo UserRepository) UserService { return UserService{ UserRepo: userRepo } }
並且您將有兩個單獨的儲存庫,都實作UserRepository
介面- 這表示它們應該具有與介面相同的名稱和相同簽名(參數、傳回類型)的方法:
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 }
您可以根據用例傳遞其中任何一個,如下面的(非常糟糕的)範例:
main.go
… var userService UserService if os.Getenv(“environment”) == “prod” { userService = NewUserService(postgreUserRepo) } else if os.Getenv(“environment”) == “dev” { userService = NewUserService(mongoUserRepo) }
以上是使用 Postgres 和 MongoDB 進行 CRUD?的詳細內容。更多資訊請關注PHP中文網其他相關文章!