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

CRUD dengan Postgres dan MongoDB?

WBOY
Lepaskan: 2024-02-09 14:00:10
ke hadapan
759 orang telah melayarinya

使用 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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
    …
}
Salin selepas log masuk

Kemudian UserService harus dibuat seperti ini:

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

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan