英文:
Check if a user already exists in a DB
问题
如何使用gorm检查数据库中是否已存在用户?我似乎找不到一个合适的方法,在没有找到用户时不会在控制台上记录错误。
这是我目前的代码:
result := models.User{}
err := connection.DB.First(&result, "username = ?", user.Username).Error
if err == gorm.ErrRecordNotFound {
if err := connection.DB.Create(&user).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "内部服务器错误",
})
}
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"message": "用户已创建",
})
}
if result.Username != "" {
return c.Status(fiber.StatusConflict).JSON(fiber.Map{
"error": "用户名已存在",
})
}
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "内部服务器错误",
})
但是,如果创建了一个新用户,终端会打印出未找到记录的错误。
英文:
How can I check if a user already exists in the database using gorm? I cannot seem to find a proper way to do so without an error logging to the console if no user was found.
This is my code so far
result := models.User{}
err := connection.DB.First(&result, "username = ?", user.Username).Error
if err == gorm.ErrRecordNotFound {
if err := connection.DB.Create(&user).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "internal server error",
})
}
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"message": "user created",
})
}
if result.Username != "" {
return c.Status(fiber.StatusConflict).JSON(fiber.Map{
"error": "username already exists",
})
}
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "internal server error",
})
but if a new user is created, an error is printed to the terminal saying the record was not found.
答案1
得分: 3
你还可以使用FirstOrCreate
。
从Doc
中:
获取第一个匹配的记录,如果不存在则创建一个新记录,使用给定的条件(仅适用于结构体、映射条件)
u := connection.DB.FirstOrCreate(user)
if u.Error != nil {
return c.Status(fiber.StatusInternalServerError).JSON(
fiber.Map{
"error": "内部服务器错误",
}
)
}
if u.RowsAffected == 1 {
return c.Status(fiber.StatusCreated).JSON(
fiber.Map{
"message": "用户创建成功",
}
)
}
return c.Status(fiber.StatusBadRequest).JSON(
fiber.Map{
"error": "用户名已存在",
}
)
英文:
You can also use FirstOrCreate
From Doc
:
> Get first matched record or create a new one with given conditions (only works with struct, map conditions)
u := connection.DB.FirstOrCreate(user)
if u.Error != nil {
return c.Status(fiber.StatusInternalServerError).JSON(
fiber.Map{
"error": "Internal server error",
}
)
}
if u.RowsAffected == 1 {
return c.Status(fiber.StatusCreated).JSON(
fiber.Map{
"message": "User created successfully",
}
)
}
return c.Status(fiber.StatusBadRequest).JSON(
fiber.Map{
"error": "Username already exists",
}
)
答案2
得分: 0
成功找到了使用原始MySQL的方法。
var exists bool = false
if err := connection.DB.Raw(
"SELECT EXISTS(SELECT 1 FROM users WHERE username = ?)",
user.Username).
Scan(&exists).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "内部服务器错误",
})
}
if exists {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "用户名已存在",
})
}
if err := connection.DB.Create(&user).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "内部服务器错误",
})
}
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"message": "用户创建成功",
})
英文:
Managed to find a way with raw MySQL.
var exists bool = false
if err := connection.DB.Raw(
"SELECT EXISTS(SELECT 1 FROM users WHERE username = ?)",
user.Username).
Scan(&exists).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "internal server error",
})
}
if exists {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Username already exists",
})
}
if err := connection.DB.Create(&user).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "internal server error",
})
}
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"message": "User created successfully",
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论