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

我正在使用 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非零?


慕姐4208626
浏览 427回答 3
3回答

SMILET

用于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}

临摹微笑

只要您只关心数据库中是否存在单一信息。我发现这种方法非常简单有效。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。

慕少森

我知道这有点老了,但我在这里看不到任何明确的答案。注意下面的 if rows.Next() 语句,如果有任何行,它将返回一个布尔值:package mainimport (    "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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go