为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go 检查 sqlite db 中是否存在值

使用 Go 检查 sqlite db 中是否存在值

Go
慕姐4208626 2022-01-10 14:52:52
我正在使用 Go 编写代码来管理 sqlite 数据库中的用户。我正在尝试检查是否使用了用户名,但我的代码很难看。我的桌子看起来像:    id INTEGER PRIMARY KEY AUTOINCREMENT,    username TEXT UNIQUE,    password TEXT我检查是否使用了用户名:func UserExists(db * sql.DB, username string) bool {    sqlStmt := `SELECT username FROM userinfo WHERE username = ?`    count := 0    rows, err := db.Query(sqlStmt, username)    Check(err)    for rows.Next() {  // Can I just check if rows is non-zero somehow?        count++    }    return len(rows) != 0}有没有更好的查询可以告诉我用户名值是否以更直接的方式存在于表中?还是有更好的方法来检查是否rows非零?
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

用于QueryRow最多查询一行。如果查询未返回任何行,则返回sql.ErrNoRows.


func UserExists(db * sql.DB, username string) bool {

    sqlStmt := `SELECT username FROM userinfo WHERE username = ?`

    err := db.QueryRow(sqlStmt, username).Scan(&username)

    if err != nil {

        if err != sql.ErrNoRows {

            // a real error happened! you should change your function return

            // to "(bool, error)" and return "false, err" here

            log.Print(err)

        }


        return false

    }


    return true

}


查看完整回答
反对 回复 2022-01-10
?
临摹微笑

TA贡献1982条经验 获得超2个赞

只要您只关心数据库中是否存在单一信息。我发现这种方法非常简单有效。


func emailExists(email string) bool {

    row := db.QueryRow("select user_email from users where user_email= ?", email)

    checkErr(err)

    temp := ""

    row.Scan(&temp)

    if temp != "" {

        return true

    }

    return false

}

如果你注意到我只得到一行。我的查询结果在临时变量中被扫描。


然后我检查临时变量是否为空。


如果不为空,则返回 true。


查看完整回答
反对 回复 2022-01-10
?
慕少森

TA贡献2019条经验 获得超9个赞

我知道这有点老了,但我在这里看不到任何明确的答案。注意下面的 if rows.Next() 语句,如果有任何行,它将返回一个布尔值:


package main


import (

    "database/sql"

    _ "github.com/mattn/go-sqlite3"

    "log"

)


func main() {

    exists, _ := SelectDBRowExists(`SELECT * FROM GEO_VELOCITY_EVENTS WHERE USERNAME='bob'`)

    log.Println(exists)

}


func SelectDBRowExists(query string) (bool, error) {


    DbConn, err := sql.Open("sqlite3", "/path/to/your/sql.sqlite3")

    if err != nil {

        return false, err

    }

    defer DbConn.Close()

    err = DbConn.Ping()


    if err != nil {

        return false, err

    }


    rows, err := DbConn.Query(query)


    if rows.Next() {

        return true, nil

    } else {

        return false, nil

    }


    defer rows.Close()


    return false, nil

}


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 426 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信