Я использую gorm с джином.
Я ставлю валидацию на модели User для уникального значения. Я предполагаю, что когда новый ввод получит ошибку, потому что эта проверка не записана в базе данных, и да, она не записана. Но я столкнулся с проблемой: идентификатор неудачного ввода где-то хранится. Поэтому, когда я не делаю ошибки, идентификатор не в порядке.
пример:
- Я пишу пользователю по электронной почте john@doe.com. это успешно с ID = 1
- Я создаю пользователя по электронной почте john@doe.com. Это ошибка, потому что проверка
- Я создаю пользователя по электронной почте jane@doe.com. Это успешно с ID = 3
Почему это происходит? пожалуйста, посмотрите на мой код
type User struct {
gorm.Model
Name string `gorm:"not null" json:"name"`
Email string `gorm:"unique;not null" json:"email"`
Username string `gorm:"unique;not null" json:"username"`
Password string `gorm:"not null" json:"password"`
Phone string `gorm:"unique" json:"phone"`
}
type registerInput struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required"`
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
Phone string `json:"phone"`
}
func Register(c *gin.Context) {
db := c.MustGet("db").(*gorm.DB)
var input registerInput
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
hashedPassword, _ := hashPassword(input.Password)
user := models.User{Name: input.Name, Email: input.Email, Username: input.Username, Password: hashedPassword, Phone: input.Phone}
if err := db.Create(&user).Error; err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": user})
}