2

Postgres と Mysql の database/sql パッケージとドライバーを使用して、次のことを達成したいと考えています。1 行を選択して、0 行、1 行、または複数行があることを知りたいです。QueryRow 関数はそれを達成しません。私が確認できる限り、複数の行があるかどうかに関係なく、エラーなしで 1 つの行を返すためです。私の状況では、複数の行がエラーになる可能性があり、それについて知りたいです。これを行うための一般的な関数を作成したいと思います。

Query関数を使った関数を作ってみたのですが、複数行ある場合に最初の行を返す方法がわかりません。複数の行があることを返したいのですが、最初の行も返したいです。複数の行があることを確認するには、Next を実行する必要があります。これにより、最初の行が上書きされます。明らかに、一般的な関数を作成しなくてもこれを達成できますが、多くの場所でこれを行う必要があるため、関数でそれを実行したいのですが、

誰かがこれを達成する方法を教えてください。すなわち。Next が成功した場合、または Next が何も返さなかった場合に、関数から最初の行を返すこと。

4

1 に答える 1

1

これを達成するためにdatabase/sql&の両方を使用しています。https://github.com/go-sql-driver/MySQLDriverダウンロードできます。MySQLDriver

execQueryデータベースから 1 つ以上の行を取得する関数を自分で作成しました。MySQLベースですが、同様の実装でPostgresにも使えると思います。

という名前の DB テーブルがあり、 、、testという名前の行があるとします。idnameage

コード:

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()すべての行をトラバースするために使用します。それがあなたが尋ねたものだと思います。

行数が非常に頻繁にカウントされることを本当に知りたい場合は、キャッシュメカニズムを使用するmemcacheDBRedis、単純なカウンターを自分で実装するだけで問題を解決できます。

于 2013-04-24T04:13:19.087 に答える