From 64a51dc093ae2b48625a6d5be333d5df9e29b2a9 Mon Sep 17 00:00:00 2001 From: go-jet Date: Fri, 18 Oct 2019 10:15:08 +0200 Subject: [PATCH] QRM returns qrm.ErrNoRows when scanning into struct destination and query result set is empty. --- internal/jet/statement.go | 4 ++-- qrm/qrm.go | 9 ++++++--- tests/postgres/scan_test.go | 3 +-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/internal/jet/statement.go b/internal/jet/statement.go index ab0c655..e4ba41b 100644 --- a/internal/jet/statement.go +++ b/internal/jet/statement.go @@ -16,11 +16,11 @@ type Statement interface { // Query executes statement over database connection db and stores row result in destination. // Destination can be either pointer to struct or pointer to a slice. - // If destination is pointer to struct and query result set is empty, method returns sql.ErrNoRows. + // If destination is pointer to struct and query result set is empty, method returns qrm.ErrNoRows. Query(db qrm.DB, destination interface{}) error // QueryContext executes statement with a context over database connection db and stores row result in destination. // Destination can be either pointer to struct or pointer to a slice. - // If destination is pointer to struct and query result set is empty, method returns sql.ErrNoRows. + // If destination is pointer to struct and query result set is empty, method returns qrm.ErrNoRows. QueryContext(context context.Context, db qrm.DB, destination interface{}) error //Exec executes statement over db connection without returning any rows. diff --git a/qrm/qrm.go b/qrm/qrm.go index 8f79c57..e7e6406 100644 --- a/qrm/qrm.go +++ b/qrm/qrm.go @@ -2,15 +2,18 @@ package qrm import ( "context" - "database/sql" + "errors" "github.com/go-jet/jet/internal/utils" "reflect" ) +// ErrNoRows is returned by Query when query result set is empty +var ErrNoRows = errors.New("qrm: no rows in result set") + // Query executes Query Result Mapping (QRM) of `query` with list of parametrized arguments `arg` over database connection `db` // using context `ctx` into destination `destPtr`. // Destination can be either pointer to struct or pointer to slice of structs. -// If destination is pointer to struct and query result set is empty, method returns sql.ErrNoRows. +// If destination is pointer to struct and query result set is empty, method returns qrm.ErrNoRows. func Query(ctx context.Context, db DB, query string, args []interface{}, destPtr interface{}) error { utils.MustBeInitializedPtr(db, "jet: db is nil") @@ -33,7 +36,7 @@ func Query(ctx context.Context, db DB, query string, args []interface{}, destPtr } if rowsProcessed == 0 { - return sql.ErrNoRows + return ErrNoRows } // edge case when row result set contains only NULLs. diff --git a/tests/postgres/scan_test.go b/tests/postgres/scan_test.go index f42dbd5..11dac96 100644 --- a/tests/postgres/scan_test.go +++ b/tests/postgres/scan_test.go @@ -1,7 +1,6 @@ package postgres import ( - "database/sql" "fmt" "github.com/go-jet/jet/internal/testutils" . "github.com/go-jet/jet/postgres" @@ -704,7 +703,7 @@ func TestStructScanErrNoRows(t *testing.T) { err := query.Query(db, &customer) - assert.Error(t, err, sql.ErrNoRows.Error()) + assert.Error(t, err, qrm.ErrNoRows.Error()) } func TestStructScanAllNull(t *testing.T) {