web-dev-qa-db-ja.com

mysqlを使用してクエリを選択して行数を取得する方法

私はgolangが初めてです。 MySQLデータベースからログイン検証を作成したい。 PHP mysqli_num_rows($res) == 1 ...のようなメソッドが必要です... len(rows)またはrows.Column() @ fmt.Println("No of rows are :", rows)を試しましたが、しません...私が試したコード...(ダミーコードです)

rows, err := db.Query("select * from userLog where u_name = ? and u_pass = ?", uname, pswd)
if err != nil {
    log.Fatal(err)
}
fmt.Println("No of rows are :", rows)
defer rows.Close()

ログイン確認の目的で別の解決策がある場合は、それを簡単に提案して説明してください。親切に私を助けてください。

8
Sohail Shaikh

私が理解しているように、ユーザーとパスワードがデータベースに存在するかどうかを確認する必要があります。もしそうなら、あなたはすることができます:

var isAuthenticated bool
err := db.QueryRow("SELECT IF(COUNT(*),'true','false') FROM userLog WHERE u_name = ? AND u_pass = ?", uname, pswd).Scan(&isAuthenticated)
if err != nil {
    log.Fatal(err)
} 

データベースに指定されたユーザーとパスワードが含まれている場合、isAuthenticatedはtrueに設定されます。

7
Yellow

クエリdb.Query("SELECT * FROM some_tbl")をすでに実行していて、rowsイテレータがある場合は、それを反復処理せずに行数を抽出することはできません。ご覧のとおり 行数を返すものはありません

したがって、実行できる唯一のことは、行数を選択するクエリを作成することです。db.Query("SELECT COUNT(*) FROM some_tbl")

6
Salvador Dali

これは、GoでMySQLselectの行数を返すかなり効率的な方法です。

rows, selerr := db.Query(sql, StartDate, EndDate) // Query
if selerr != nil { 
    fmt.Fprint(w, selerr); 
    return 
}
count := 0
for rows.Next() { 
    count += 1 
}

rows, _ := db.Query(sql, StartDate, EndDate) // Query again - no error 
4
user2099484

前述のように、count(*)は正常に機能し、スキャンを使用するとさらに簡単になります。例:

func GetCount(schemadottablename string) int {
    var cnt int
    _ = db.QueryRow(`select count(*) from ` + schemadottablename).Scan(&cnt)
    return cnt 
}

もちろん、これをwhereステートメントとともに使用して、カウントを「調整」することもできます。例:

func GetCount(schemadottablename string, column string, value string) int {
    var cnt int
    _ = db.QueryRow(`select count(` + column + `) from ` + schemadottablename + ` where ` + column + `=?`, value).Scan(&cnt)
    return cnt 

}

2
user2099484

アプリケーションの言語に違いはありません。 count(*)を使用します:

select count(*) as cnt
from userLog
where u_name = ? and u_pass = ?;

次に、クエリが返す値を読み取ります。

0
Gordon Linoff

この主題にいくつかの洞察を追加するために、selectステートメントをselect count(*)に表現できる一般的なレシピを作成したいと思いましたか?これは、ページ付けの問題や、できれば誰かが探しているものに役立つ可能性があります。

package main

import (
    "fmt"
    "regexp"
)

const sample = `select a,b,c
from <table>
where <conditions>`

func main() {
    var re = regexp.MustCompile(`(select)\b.[\s\S]*(from[\s\S]*)`)
    s := re.ReplaceAllString(sample, "$1 count(*)\n$2")
    fmt.Println(sample + "\n")
    fmt.Println(s)
}

https://play.golang.org/p/29Iiv1Ta-0_D

0
Victor