GoでSQLの結果を取得する
4パターンある
Execute a query that returns rows.
Prepare a statement for repeated use, execute it multiple times, and destroy it.
Execute a statement in a once-off fashion, without preparing it for repeated use.
Execute a query that returns a single row. There is a shortcut for this special case.
メソッドのルール
Queryとついている名前のメソッドだけがrowsを返す
次のコードに出てくるメソッド
db.Query
rows.Close
rows.Next
rows.Scan func (rs *Rows) Scan(dest ...interface{}) error
rows.Err
code:main.go
var (
id int
name string
)
rows, err := db.Query("select id, name from users where id = ?", 1)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
Prepared statementを使う場合
注意: stmt.Queryは、
prepare
execute
close
の3つを行う(ドライバーにもよる)。データベースと3往復の通信を行うことになる。
code:prepared_statement.go
func usePreparedQuery(db *sql.DB) error {
stmt, err := db.Prepare("select id, name from users where id = ?")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
rows, err := stmt.Query(1)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var (
id int
name string
)
for rows.Next() {
rows.Scan(&id, &name)
log.Println(id, name)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
return nil
}