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

huangapple go评论83阅读模式
英文:

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

huangapple
  • 本文由 发表于 2021年11月5日 21:27:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/69854025.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定