Postgres と Mysql の database/sql パッケージとドライバーを使用して、次のことを達成したいと考えています。1 行を選択して、0 行、1 行、または複数行があることを知りたいです。QueryRow 関数はそれを達成しません。私が確認できる限り、複数の行があるかどうかに関係なく、エラーなしで 1 つの行を返すためです。私の状況では、複数の行がエラーになる可能性があり、それについて知りたいです。これを行うための一般的な関数を作成したいと思います。
Query関数を使った関数を作ってみたのですが、複数行ある場合に最初の行を返す方法がわかりません。複数の行があることを返したいのですが、最初の行も返したいです。複数の行があることを確認するには、Next を実行する必要があります。これにより、最初の行が上書きされます。明らかに、一般的な関数を作成しなくてもこれを達成できますが、多くの場所でこれを行う必要があるため、関数でそれを実行したいのですが、
誰かがこれを達成する方法を教えてください。すなわち。Next が成功した場合、または Next が何も返さなかった場合に、関数から最初の行を返すこと。
1 に答える
1
これを達成するためにdatabase/sql
&の両方を使用しています。https://github.com/go-sql-driver/でMySQLDriver
ダウンロードできます。MySQLDriver
execQuery
データベースから 1 つ以上の行を取得する関数を自分で作成しました。MySQLベースですが、同様の実装でPostgresにも使えると思います。
という名前の DB テーブルがあり、 、、test
という名前の行があるとします。id
name
age
コード:
var db *sql.DB // it should be initialized by "sql.Open()"
func execQuery(SQL string, args ...interface{}) (rows *sql.Rows, is_succeed bool) {
rows, err := db.Query(SQL, args...)
var ret bool
if err == nil && rows != nil { // if DB query error rows will be nil, it will return false
ret = true
} else {
ret = false
}
return rows, ret
}
使用法:
var name, age string
rows, is_succeed = execQuery("SELECT `name`, `age` FROM `test` WHERE `id` = ?", "123")
if !is_succeed {
// error
return
}
for rows.Next() { // if have zero result rows, this for route won't execute
err := rows.Scan(&name, &age)
// check if has error & do something
}
返された行数を知りたい場合は、for
ルートにカウンターを追加するだけで、SQL を使用してこれを達成することもできます。
sql.Rows
リスト構造が好きで、rows *sql.Rows
返された行の最初の行を指します。rows.Next()
すべての行をトラバースするために使用します。それがあなたが尋ねたものだと思います。
行数が非常に頻繁にカウントされることを本当に知りたい場合は、キャッシュメカニズムを使用するmemcacheDB
かRedis
、単純なカウンターを自分で実装するだけで問題を解決できます。
于 2013-04-24T04:13:19.087 に答える