检查用户是否已存在于数据库中

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",
    }
)