1
0
mirror of https://github.com/golang/go synced 2024-11-23 15:30:05 -07:00

database/sql: add method Err on sql.Row

The Row.Err method is intended to assist wrapping sql.DB.
Because sql.Row is a struct with private fields,
a wrapper in an existing code base cannot easily provide users
with a different implementation without large rewrites.
Adding this method allows query level errors to be handled
centrally.

Fixes #35804

Change-Id: I94e6329de89a7ee1284ce9ef76af4363d2d081f9
Reviewed-on: https://go-review.googlesource.com/c/go/+/214317
Reviewed-by: Daniel Theophanes <kardianos@gmail.com>
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Tim Möhlmann 2020-01-10 12:06:53 +02:00 committed by Daniel Theophanes
parent b3b174ffcf
commit f9f57c4443
2 changed files with 26 additions and 0 deletions

View File

@ -3174,6 +3174,14 @@ func (r *Row) Scan(dest ...interface{}) error {
return r.rows.Close()
}
// Err provides a way for wrapping packages to check for
// query errors without calling Scan.
// Err returns the error, if any, that was encountered while running the query.
// If this error is not nil, this error will also be returned from Scan.
func (r *Row) Err() error {
return r.err
}
// A Result summarizes an executed SQL command.
type Result interface {
// LastInsertId returns the integer generated by the database

View File

@ -788,6 +788,24 @@ func TestQueryRow(t *testing.T) {
}
}
func TestRowErr(t *testing.T) {
db := newTestDB(t, "people")
err := db.QueryRowContext(context.Background(), "SELECT|people|bdate|age=?", 3).Err()
if err != nil {
t.Errorf("Unexpected err = %v; want %v", err, nil)
}
ctx, cancel := context.WithCancel(context.Background())
cancel()
err = db.QueryRowContext(ctx, "SELECT|people|bdate|age=?", 3).Err()
exp := "context canceled"
if err == nil || !strings.Contains(err.Error(), exp) {
t.Errorf("Expected err = %v; got %v", exp, err)
}
}
func TestTxRollbackCommitErr(t *testing.T) {
db := newTestDB(t, "people")
defer closeDB(t, db)