检查用户是否已存在于数据库中
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": "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",
})
但如果创建新用户,则会向终端打印一条错误消息,提示未找到记录。
设法找到原始 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",
})
您也可以使用FirstOrCreate
来自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",
}
)
如何使用 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": "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",
})
但如果创建新用户,则会向终端打印一条错误消息,提示未找到记录。
设法找到原始 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",
})
您也可以使用FirstOrCreate
来自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",
}
)