目录
问题内容
解决方法
首页 后端开发 Golang 使用 Postgres 和 MongoDB 进行 CRUD?

使用 Postgres 和 MongoDB 进行 CRUD?

Feb 09, 2024 pm 02:00 PM
用户注册

使用 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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

铁路12306电子邮箱怎么注册 铁路12306电子邮箱怎么注册 Apr 30, 2024 am 11:33 AM

注册铁路12306电子邮箱的步骤如下:访问12306网站,点击“注册”;选择“邮箱注册”,填写邮箱、姓名、手机等信息;根据提示设置密码和安全问题;输入邮箱验证码和手机验证码验证信息;点击“完成注册”即可。

网易《漫威超级战争》宣布停运 曾是漫威首款MOBA游戏! 网易《漫威超级战争》宣布停运 曾是漫威首款MOBA游戏! Apr 18, 2024 am 10:50 AM

网易《漫威超级战争》宣布将于2024年6月17日15时终止运营并关闭游戏服务器。现在已关闭全平台下载入口,停止游戏充值、新用户注册。作为漫威的首款MOBA手游,这款游戏原汁原味地展现了超级英雄的战斗特色,还原了漫威宇宙宏大的世界观。在游戏中,您将能够与复仇者联盟、X战警、神奇四侠以及众多超级英雄和超级反派一起集结于平行宇宙,与钢铁侠、美国队长、蜘蛛侠、洛基、灭霸、死侍等超过60位经典漫威角色共同战斗!

Bitget Wallet交易所怎么注册不了是什么原因 Bitget Wallet交易所怎么注册不了是什么原因 Sep 06, 2024 pm 03:34 PM

无法注册BitgetWallet交易所的原因有多种,包括账户限制、不支持的地区、网络问题、系统维护和技术故障。要注册BitgetWallet交易所,请访问官网、填写信息、同意条款、完成注册并验证身份。

Gate.io芝麻开门新用户注册充值教程 Gate.io芝麻开门新用户注册充值教程 Apr 25, 2024 pm 04:53 PM

如何注册和充值 Gate.io 账户:1.访问 Gate.io 官网并点击“注册”。2.选择注册方式(电子邮件或手机)、设置密码、同意条款。3.登录账户,点击“充值”。4.选择法币或加密货币充值,输入金额,选择充值方式。5.获取充值地址,从外部钱包或交易所转账。

抖音为什么有两个账号?手机分身装两个抖音怎么做? 抖音为什么有两个账号?手机分身装两个抖音怎么做? May 06, 2024 pm 09:28 PM

在数字化时代,社交媒体已成为人们生活中不可或缺的一部分。抖音,作为国内最受欢迎的短视频平台之一,吸引了大量用户。有些用户甚至注册了两个账号,那么,抖音为什么有两个账号呢?本文将为您解答这个问题,并介绍如何在手机上安装两个抖音账号。一、抖音为什么有两个账号?功能区分:某些用户会根据内容类型或功能来区分账户,比如一个账户用于分享生活日常,另一个账户用于展示专业技能。2.隐私保护:有些用户希望通过两个账号来保护自己的隐私,将生活和工作分离,避免信息泄露。3.互动需求:有些用户可能因为互动需求而注册两个

抖音多个账号关联怎么关闭?账号关联有什么作用? 抖音多个账号关联怎么关闭?账号关联有什么作用? Apr 20, 2024 pm 05:58 PM

抖音,作为时下最热门的短视频平台,吸引了无数用户注册和分享。有些用户可能会注册多个抖音账号,用于不同的用途。抖音允许用户将多个账号关联起来,方便管理。但有些时候,用户可能需要解除账号之间的关联。本文将围绕“抖音多个账号关联怎么关闭”展开,详细介绍关闭账号关联的方法,以及账号关联的作用。一、抖音多个账号关联怎么关闭?1.打开抖音APP,进入“我”个人主页。2.点击右上角的“三条杠”图标,打开功能菜单。3.在功能菜单中,找到“设置”选项,点击进入。4.在设置页面中,找到“账号与安全”选项,点击进入。

国外的usdt交易所 国外的usdt交易所 Apr 19, 2024 pm 04:01 PM

海外USDT交易所是境外注册和运营的,主要基于USDT进行交易的数字货币交易平台。主要特点包括:支持USDT交易、全球服务、流动性高、支持多种币种和法币出入金渠道。在选择海外USDT交易所时,应考虑安全性、交易费用、币种支持、法币出入金和客服支持。知名交易所包括币安、火币、欧易、Coinbase。

抖音火花变色规则详解是什么?各种火花颜色达成条件 抖音火花变色规则详解是什么?各种火花颜色达成条件 May 04, 2024 am 09:31 AM

抖音平台为了增强用户互动和提升用户体验,推出了火花这一有趣的互动机制。用户通过在抖音上的一系列行为,可以激活并升级自己的火花,不同的颜色代表着不同的成就和荣誉。了解抖音火花的变色规则,可以帮助用户更好地参与和互动,享受抖音带来的社交乐趣。一、抖音火花变色规则详解是什么?1.行为激活用户的互动行为,如点赞、评论、分享等,可以激活火花。2.等级提升随着用户互动行为的增加,火花会逐渐升级,颜色也会随之变化。3.颜色变化火花的颜色变化通常与用户的互动频率、互动质量以及参与活动的积极性相关。4.任务完成完

See all articles