Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang CRUD dengan Postgres dan MongoDB?

CRUD dengan Postgres dan MongoDB?

Feb 09, 2024 pm 02:00 PM
Pendaftaran pengguna

使用 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!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mendaftar alamat e-mel kereta api 12306 Bagaimana untuk mendaftar alamat e-mel kereta api 12306 Apr 30, 2024 am 11:33 AM

Langkah-langkah untuk mendaftarkan alamat e-mel Railway 12306 adalah seperti berikut: Layari laman web 12306 dan klik "Daftar" pilih "Pendaftaran E-mel" dan isikan e-mel, nama, telefon bimbit dan maklumat lain mengikut kata laluan; gesaan; masukkan kod pengesahan e-mel dan kod pengesahan telefon mudah alih untuk Maklumat pengesahan;

Mengapa saya tidak boleh mendaftar di bursa Bitget Wallet? Mengapa saya tidak boleh mendaftar di bursa Bitget Wallet? Sep 06, 2024 pm 03:34 PM

Terdapat pelbagai sebab untuk tidak dapat mendaftar untuk pertukaran BitgetWallet, termasuk sekatan akaun, wilayah tidak disokong, isu rangkaian, penyelenggaraan sistem dan kegagalan teknikal. Untuk mendaftar untuk pertukaran BitgetWallet, sila lawati laman web rasmi, isi maklumat, bersetuju dengan syarat, lengkapkan pendaftaran dan sahkan identiti anda.

Gate.io Buka Tutorial Pendaftaran Pengguna Baharu dan Caj Semula Sesame Gate.io Buka Tutorial Pendaftaran Pengguna Baharu dan Caj Semula Sesame Apr 25, 2024 pm 04:53 PM

Cara mendaftar dan mengecas semula akaun Gate.io: 1. Layari laman web rasmi Gate.io dan klik "Daftar". 2. Pilih kaedah pendaftaran (e-mel atau telefon bimbit), tetapkan kata laluan, dan bersetuju dengan terma. 3. Log masuk ke akaun anda dan klik "Caj semula". 4. Pilih mata wang atau mata wang kripto yang sah untuk dicas semula, masukkan amaun dan pilih kaedah cas semula. 5. Dapatkan alamat caj semula dan pindahkan dana daripada dompet atau bursa luar.

Mengapa Douyin mempunyai dua akaun? Bagaimana untuk memasang dua TikToks pada telefon bimbit? Mengapa Douyin mempunyai dua akaun? Bagaimana untuk memasang dua TikToks pada telefon bimbit? May 06, 2024 pm 09:28 PM

Dalam era digital, media sosial telah menjadi sebahagian daripada kehidupan orang ramai. Douyin, sebagai salah satu platform video pendek paling popular di China, telah menarik sejumlah besar pengguna. Sesetengah pengguna telah mendaftarkan dua akaun Jadi, mengapa Douyin mempunyai dua akaun? Artikel ini akan menjawab soalan ini untuk anda dan menerangkan cara memasang dua akaun Douyin pada telefon anda. 1. Mengapakah Douyin mempunyai dua akaun? Pembezaan fungsi: Sesetengah pengguna akan membezakan akaun berdasarkan jenis kandungan atau fungsi Contohnya, satu akaun digunakan untuk berkongsi kehidupan harian, dan akaun lain digunakan untuk menunjukkan kemahiran profesional. 2. Perlindungan privasi: Sesetengah pengguna berharap dapat melindungi privasi mereka melalui dua akaun, kehidupan dan kerja yang berasingan, dan mengelakkan kebocoran maklumat. 3. Keperluan interaksi: Sesetengah pengguna mungkin mendaftar dua kerana keperluan interaksi

Bagaimana untuk menutup perkaitan berbilang akaun di Douyin? Apakah peranan pemautan akaun? Bagaimana untuk menutup perkaitan berbilang akaun di Douyin? Apakah peranan pemautan akaun? Apr 20, 2024 pm 05:58 PM

Douyin, sebagai platform video pendek yang paling popular pada masa kini, telah menarik ramai pengguna untuk mendaftar dan berkongsi. Sesetengah pengguna boleh mendaftarkan berbilang akaun Douyin untuk tujuan yang berbeza. Douyin membenarkan pengguna memautkan berbilang akaun untuk pengurusan yang mudah. Tetapi kadangkala, pengguna mungkin perlu menyahkaitan akaun. Artikel ini akan menumpukan pada "Cara menutup perkaitan berbilang akaun di Douyin" dan memperkenalkan secara terperinci kaedah menutup perkaitan akaun dan peranan perkaitan akaun. 1. Bagaimana untuk menutup perkaitan berbilang akaun di Douyin? 1. Buka APP Douyin dan masukkan halaman utama peribadi "Saya". 2. Klik ikon "tiga jalur" di penjuru kanan sebelah atas untuk membuka menu fungsi. 3. Dalam menu fungsi, cari pilihan "Tetapan" dan klik untuk masuk. 4. Dalam halaman tetapan, cari pilihan "Akaun dan Keselamatan" dan klik untuk masuk.

pertukaran usdt asing pertukaran usdt asing Apr 19, 2024 pm 04:01 PM

Pertukaran USDT luar negara ialah platform dagangan mata wang digital yang didaftarkan dan dikendalikan di luar negara, terutamanya berdasarkan USDT. Ciri-ciri utama termasuk: sokongan untuk transaksi USDT, perkhidmatan global, kecairan tinggi, sokongan untuk pelbagai mata wang dan saluran deposit dan pengeluaran mata wang sah. Apabila memilih pertukaran USDT luar negara, anda harus mempertimbangkan keselamatan, yuran transaksi, sokongan mata wang, deposit dan pengeluaran mata wang fiat dan sokongan perkhidmatan pelanggan. Pertukaran yang terkenal termasuk Binance, Huobi, Oyi dan Coinbase.

Apakah penjelasan terperinci tentang peraturan perubahan warna percikan Douyin? Pelbagai warna percikan memenuhi syarat Apakah penjelasan terperinci tentang peraturan perubahan warna percikan Douyin? Pelbagai warna percikan memenuhi syarat May 04, 2024 am 09:31 AM

Untuk meningkatkan interaksi pengguna dan meningkatkan pengalaman pengguna, platform Douyin telah melancarkan Sparks, mekanisme interaktif yang menarik. Pengguna boleh mengaktifkan dan meningkatkan percikan api mereka melalui satu siri tindakan pada Douyin Warna yang berbeza mewakili pencapaian dan penghormatan yang berbeza. Memahami peraturan perubahan warna Douyin Spark boleh membantu pengguna mengambil bahagian dan berinteraksi dengan lebih baik, serta menikmati keseronokan sosial yang dibawa oleh Douyin. 1. Apakah penjelasan terperinci tentang peraturan perubahan warna percikan Douyin? 1. Gelagat mengaktifkan gelagat interaktif pengguna, seperti suka, komen, perkongsian, dll., yang boleh mengaktifkan percikan api. 2. Peningkatan tahap Apabila interaksi pengguna meningkat, percikan api akan meningkat secara beransur-ansur dan warna akan berubah dengan sewajarnya. 3. Perubahan warna Perubahan warna percikan api biasanya berkaitan dengan kekerapan interaksi pengguna, kualiti interaksi, dan semangat untuk menyertai aktiviti. 4. Tugasan selesai

Pintu masuk laman web rasmi DeepSeek dan aktiviti promosi terkini Pintu masuk laman web rasmi DeepSeek dan aktiviti promosi terkini Feb 19, 2025 pm 05:15 PM

Laman web rasmi DeepSeek kini melancarkan pelbagai aktiviti diskaun untuk menyediakan pengguna dengan pengalaman membeli -belah. Pengguna baru mendaftar untuk mendapatkan kupon $ 10, dan nikmati diskaun masa terhad 15% untuk keseluruhan penonton. Mengesyorkan rakan juga boleh mendapat ganjaran, dan anda boleh mengumpul mata untuk penebusan hadiah semasa membeli -belah. Tarikh akhir acara berbeza.

See all articles