@@ -2,6 +2,7 @@ package db
2
2
3
3
import (
4
4
"context"
5
+ "database/sql"
5
6
"errors"
6
7
"fmt"
7
8
"reflect"
@@ -34,10 +35,27 @@ func QueryRows(ctx context.Context, query string, args ...any) sqldb.RowsScanner
34
35
}
35
36
36
37
// QueryValue queries a single value of type T.
37
- func QueryValue [T any ](ctx context.Context , query string , args ... any ) (T , error ) {
38
- var val T
39
- err := Conn (ctx ).QueryRow (query , args ... ).Scan (& val )
40
- return val , err
38
+ func QueryValue [T any ](ctx context.Context , query string , args ... any ) (value T , err error ) {
39
+ err = Conn (ctx ).QueryRow (query , args ... ).Scan (& value )
40
+ if err != nil {
41
+ var zero T
42
+ return zero , err
43
+ }
44
+ return value , nil
45
+ }
46
+
47
+ // QueryValueOrDefault queries a single value of type T
48
+ // or returns the default zero value of T in case of sql.ErrNoRows.
49
+ func QueryValueOrDefault [T any ](ctx context.Context , query string , args ... any ) (value T , err error ) {
50
+ err = Conn (ctx ).QueryRow (query , args ... ).Scan (& value )
51
+ if err != nil {
52
+ var zero T
53
+ if errors .Is (err , sql .ErrNoRows ) {
54
+ return zero , nil
55
+ }
56
+ return zero , err
57
+ }
58
+ return value , err
41
59
}
42
60
43
61
// QueryStruct uses the passed pkValues to query a table row
@@ -79,7 +97,13 @@ func QueryStruct[S any](ctx context.Context, pkValues ...any) (row *S, err error
79
97
// passed pkValues.
80
98
func QueryStructOrNil [S any ](ctx context.Context , pkValues ... any ) (row * S , err error ) {
81
99
row , err = QueryStruct [S ](ctx , pkValues ... )
82
- return row , ReplaceErrNoRows (err , nil )
100
+ if err != nil {
101
+ if errors .Is (err , sql .ErrNoRows ) {
102
+ return nil , nil
103
+ }
104
+ return nil , err
105
+ }
106
+ return row , nil
83
107
}
84
108
85
109
func pkColumnsOfStruct (conn sqldb.Connection , t reflect.Type ) (table string , columns []string , err error ) {
0 commit comments