首頁 > 後端開發 > Golang > 主體

使用 Postgres 和 MongoDB 進行 CRUD?

WBOY
發布: 2024-02-09 14:00:10
轉載
731 人瀏覽過

使用 Postgres 和 MongoDB 进行 CRUD?

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中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!