我正在使用 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
是否非零?
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
}
我知道这有点旧,但我在这里没有看到任何干净的答案。注意下面的 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
}
只要您只关心数据库中是否存在一条信息。我发现这个方法相当简单有效。
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。
我认为我们可以使用上面的函数来检查数据库中是否已经存在条件。
if helper.UserExists(db, username) {
return username, errors.New("data already exist")
}
因为该函数返回 bool,这意味着如果调用该函数,return 将默认返回 true。 我希望这有用。
有很多方法可以做到这一点。 我个人是这样的:
var usernameCount int
r := db.QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM users WHERE username = '%s';", username))
r.Scan(&usernameCount)
if usernameCount == 0 {
// code here
}