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

时间:2016-05-10 18:07:46

标签: sql sqlite go

我正在使用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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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
}

如果您发现只得到一行。 我的查询结果将在临时变量中扫描。

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

如果不为空,则返回true。

答案 2 :(得分:0)

我知道这有点老了,但是我在这里看不到任何明确的答案。注意下面的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
}