1. ホーム
  2. sql

[解決済み] "sql: 結果セットに行がありません"

2022-02-19 11:10:22

質問

HTML フォームを通じて Go バックエンドに送信されたユーザー認証データを処理しています。私は いくつかのボイラープレート を使用して、Go をよりよく学ぶことができます。

私の問題は、次のようなものです。 func を返します。

func (ctrl UserController) Signin(c *gin.Context) {

  var signinForm forms.SigninForm
  user, err := userModel.Signin(signinForm)

  if err := c.ShouldBindWith(&signinForm, binding.Form); err != nil {
      c.JSON(406, gin.H{"message": "Invalid signin form", "form": signinForm})
      c.Abort()
      return
  }

    if err == nil {
        session := sessions.Default(c)
        session.Set("user_id", user.ID)
        session.Set("user_email", user.Email)
        session.Set("user_name", user.Name)
        session.Save()

        c.JSON(200, gin.H{"message": "User signed in", "user": user})
    } else {
        c.JSON(406, gin.H{"message": "Invalid signin details", "error": err.Error()})
    }

}

最初の if 文は入力の検証を行い、うまく動作します (メールが適切なメール形式でない場合はエラー、そうでない場合はエラーなし)。しかし、入力が適切に検証された場合は else 節が起動され、以下のようなJSONが返されます。

{
error: "sql: no rows in result set",
message: "Invalid signin details"
}

関連するコードも掲載しておくと便利でしょう。 User モデルで使用されます。

//User ...
type User struct {
    ID        int    `db:"id, primarykey, autoincrement" json:"id"`
    Email     string `db:"email" json:"email"`
    Password  string `db:"password" json:"-"`
    Name      string `db:"name" json:"name"`
    UpdatedAt int64  `db:"updated_at" json:"updated_at"`
    CreatedAt int64  `db:"created_at" json:"created_at"`
}

//UserModel ...
type UserModel struct{}

//Signin ...
func (m UserModel) Signin(form forms.SigninForm) (user User, err error) {

    err = db.GetDB().SelectOne(&user, "SELECT id, email, password, name, updated_at, created_at FROM public.user WHERE email=LOWER($1) LIMIT 1", form.Email)

    if err != nil {
        return user, err
    }

    bytePassword := []byte(form.Password)
    byteHashedPassword := []byte(user.Password)

    err = bcrypt.CompareHashAndPassword(byteHashedPassword, bytePassword)

    if err != nil {
        return user, errors.New("Invalid password")
    }

    return user, nil
}

を解決するにはどうすればよいのでしょうか? sql: no rows in result set のエラーが発生しました。

解決方法を教えてください。

コード内の操作の順序を変更する必要があります。 まず、リクエストからデータを取得するために if err := c.ShouldBindWith(&signinForm, binding.Form); err != nil { でデータベースからデータを取得し、その後に user, err := userModel.Signin(signinForm)