Skip to content

Commit 5b41b84

Browse files
committed
added db.QueryValueOrDefault
1 parent f59ae45 commit 5b41b84

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

db/query.go

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package db
22

33
import (
44
"context"
5+
"database/sql"
56
"errors"
67
"fmt"
78
"reflect"
@@ -34,10 +35,27 @@ func QueryRows(ctx context.Context, query string, args ...any) sqldb.RowsScanner
3435
}
3536

3637
// 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
4159
}
4260

4361
// 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
7997
// passed pkValues.
8098
func QueryStructOrNil[S any](ctx context.Context, pkValues ...any) (row *S, err error) {
8199
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
83107
}
84108

85109
func pkColumnsOfStruct(conn sqldb.Connection, t reflect.Type) (table string, columns []string, err error) {

0 commit comments

Comments
 (0)