【问题标题】:Proper way to query to check if credentials already exist [duplicate]查询以检查凭据是否已存在的正确方法[重复]
【发布时间】:2020-09-13 06:16:57
【问题描述】:

我目前有:

func foo (w http.ResponseWriter, req *http.Request) {
    chekr := `SELECT FROM public."Users" WHERE email=$1`
    err = db.QueryRow(chekr, usr.Email).Scan()
    if err != sql.ErrNoRows {
        data, err := json.Marshal("There is already a user with this email")
        if err != nil { w.Write(data) }
    }
    // code that should run if email isn't found
}

但是,我发现它从不工作并且总是通过 if 块。

【问题讨论】:

  • 你错过了SELECTFROM 之间的一些东西。 Maby SELECT * FROM ...SELECT 1 FROM ... 如果您不关心结果值。
  • @GMB 是正确的方向。确保您的 chekr 是有效的 Postgres SQL SELECT
  • 错误处理没有意义。仅仅因为没有 ErrNoRows 并不意味着它有效。可能有任意数量的其他错误。此外,只有在编码失败时,您才会编写错误消息。

标签: postgresql go pq


【解决方案1】:

正如上面的评论所说,我忘记了 */1。 QueryRow 有效,我只是在某个地方遇到了另一个错误。正如其他人所说,还有其他错误,这只是为了测试一个案例。

【讨论】:

  • 这听起来不对。 The implementation for QueryRow 只调用 QueryRowContext,所以两者之间的唯一区别是您可以将上下文传递给 QueryRowContextdocs 状态“*Row 的扫描将返回 ErrNoRows”,我刚刚成功测试了这一点。
  • play.golang.org/p/CA-CQj-S7Ox 请注意,您可以使用raw strings(即`text surrounded by backticks`)来避免转义双引号。另请注意,在给定的示例中,手动创建准备好的语句并立即关闭它没有任何好处,(*sql.DB).QueryXxx 方法已经在 when 查询接受参数下执行此操作。准备好的语句才有意义,AFAICT,只有当您需要多次执行它们时。
  • 抱歉,我的立场已得到纠正。我进一步阅读并发现错误会发生在 QueryRow 我之前的代码中一定有错误。就错误处理而言,这是一个测试我知道不起作用的一个条件的示例。您应该使用他们在文档中使用的开关。我很欣赏有关 Close() stmt 的信息,我只是使用了文档中的内容,并且它向他们展示了使用它。
猜你喜欢
  • 2019-02-26
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2019-09-16
  • 2018-09-18
相关资源
最近更新 更多