Add QRM error if result set is empty when scanning into struct destination.

This commit is contained in:
go-jet 2019-10-10 16:09:44 +02:00
parent 02fafd8a7a
commit 8c9ae77cd8
6 changed files with 61 additions and 22 deletions

View file

@ -38,7 +38,7 @@ func Query(ctx context.Context, db DB, query string, args []interface{}, destPtr
} }
if tempSliceValue.Len() == 0 { if tempSliceValue.Len() == 0 {
return nil return sql.ErrNoRows
} }
structValue := reflect.ValueOf(destPtr).Elem() structValue := reflect.ValueOf(destPtr).Elem()

View file

@ -516,7 +516,8 @@ func TestStringOperators(t *testing.T) {
fmt.Println(query.DebugSql()) fmt.Println(query.DebugSql())
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -586,7 +587,8 @@ FROM test_sample.all_types;
`, "20:34:58", "23:06:06", "22:06:06.011", "21:06:06.011111", "20:16:06", `, "20:34:58", "23:06:06", "22:06:06.011", "21:06:06.011111", "20:16:06",
"19:26:06", "18:36:06", "17:46:06", "16:56:56", "15:16:46", "14:26:36") "19:26:06", "18:36:06", "17:46:06", "16:56:56", "15:16:46", "14:26:36")
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -646,7 +648,8 @@ SELECT CAST(? AS DATE),
FROM test_sample.all_types; FROM test_sample.all_types;
`) `)
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -708,7 +711,8 @@ SELECT all_types.date_time = all_types.date_time,
FROM test_sample.all_types; FROM test_sample.all_types;
`) `)
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -769,7 +773,8 @@ SELECT all_types.timestamp = all_types.timestamp,
CURRENT_TIMESTAMP(2) CURRENT_TIMESTAMP(2)
FROM test_sample.all_types; FROM test_sample.all_types;
`) `)
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }

View file

@ -228,7 +228,8 @@ LIMIT ?;
testutils.AssertStatementSql(t, query, expectedSQL, int64(1), int64(1), int64(10), int64(1), int64(2), int64(1), int64(12)) testutils.AssertStatementSql(t, query, expectedSQL, int64(1), int64(1), int64(10), int64(1), int64(2), int64(1), int64(12))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -263,7 +264,8 @@ LIMIT ?;
testutils.AssertStatementSql(t, query2, expectedSQL, int64(1), int64(10), int64(1), int64(2), int64(1)) testutils.AssertStatementSql(t, query2, expectedSQL, int64(1), int64(10), int64(1), int64(2), int64(1))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -305,7 +307,8 @@ OFFSET ?;
testutils.AssertStatementSql(t, query2, expectedSQL, int64(1), int64(10), int64(1), int64(2), int64(4), int64(3)) testutils.AssertStatementSql(t, query2, expectedSQL, int64(1), int64(10), int64(1), int64(2), int64(4), int64(3))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -510,7 +513,8 @@ SELECT true,
'date'; 'date';
`) `)
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -530,7 +534,8 @@ LOCK IN SHARE MODE;
testutils.AssertDebugStatementSql(t, query, expectedSQL) testutils.AssertDebugStatementSql(t, query, expectedSQL)
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -606,7 +611,8 @@ GROUP BY payment.amount, payment.customer_id, payment.payment_date;
testutils.AssertStatementSql(t, query, expectedSQL, 100, 100, int64(10)) testutils.AssertStatementSql(t, query, expectedSQL, 100, 100, int64(10))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -641,7 +647,8 @@ ORDER BY payment.customer_id;
testutils.AssertStatementSql(t, query, expectedSQL, int64(10)) testutils.AssertStatementSql(t, query, expectedSQL, int64(10))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }

View file

@ -170,7 +170,8 @@ func TestExpressionCast(t *testing.T) {
//fmt.Println(query.DebugSql()) //fmt.Println(query.DebugSql())
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -249,7 +250,8 @@ func TestStringOperators(t *testing.T) {
//fmt.Println(query.DebugSql()) //fmt.Println(query.DebugSql())
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -618,7 +620,8 @@ func TestTimeExpression(t *testing.T) {
//fmt.Println(query.DebugSql()) //fmt.Println(query.DebugSql())
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }

View file

@ -50,14 +50,16 @@ func TestScanToInvalidDestination(t *testing.T) {
func TestScanToValidDestination(t *testing.T) { func TestScanToValidDestination(t *testing.T) {
t.Run("pointer to struct", func(t *testing.T) { t.Run("pointer to struct", func(t *testing.T) {
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
}) })
t.Run("global query function scan", func(t *testing.T) { t.Run("global query function scan", func(t *testing.T) {
queryStr, args := query.Sql() queryStr, args := query.Sql()
err := qrm.Query(nil, db, queryStr, args, &struct{}{}) dest := []struct{}{}
err := qrm.Query(nil, db, queryStr, args, &dest)
assert.NilError(t, err) assert.NilError(t, err)
}) })

View file

@ -1,6 +1,7 @@
package postgres package postgres
import ( import (
"database/sql"
"fmt" "fmt"
"github.com/go-jet/jet/internal/testutils" "github.com/go-jet/jet/internal/testutils"
. "github.com/go-jet/jet/postgres" . "github.com/go-jet/jet/postgres"
@ -162,7 +163,8 @@ LIMIT 12;
testutils.AssertDebugStatementSql(t, query, expectedSQL, int64(1), int64(1), int64(10), int64(1), int64(2), int64(1), int64(12)) testutils.AssertDebugStatementSql(t, query, expectedSQL, int64(1), int64(1), int64(10), int64(1), int64(2), int64(1), int64(12))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -1617,7 +1619,8 @@ SELECT true,
'date'; 'date';
`) `)
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -1688,7 +1691,8 @@ GROUP BY payment.amount, payment.customer_id, payment.payment_date;
testutils.AssertStatementSql(t, query, expectedSQL, 100, 100, int64(10)) testutils.AssertStatementSql(t, query, expectedSQL, 100, 100, int64(10))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
@ -1723,12 +1727,14 @@ ORDER BY payment.customer_id;
testutils.AssertStatementSql(t, query, expectedSQL, int64(10)) testutils.AssertStatementSql(t, query, expectedSQL, int64(10))
err := query.Query(db, &struct{}{}) dest := []struct{}{}
err := query.Query(db, &dest)
assert.NilError(t, err) assert.NilError(t, err)
} }
func TestSimpleView(t *testing.T) { func TestSimpleView(t *testing.T) {
query := SELECT( query := SELECT(
view.ActorInfo.AllColumns, view.ActorInfo.AllColumns,
). ).
@ -1743,6 +1749,12 @@ func TestSimpleView(t *testing.T) {
FilmInfo string FilmInfo string
} }
//sql, args := query.Sql()
//
//row := db.QueryRow(sql, args...)
//
//row.Scan()
var dest []ActorInfo var dest []ActorInfo
err := query.Query(db, &dest) err := query.Query(db, &dest)
@ -1786,3 +1798,13 @@ func TestJoinViewWithTable(t *testing.T) {
assert.Equal(t, len(dest[0].Rentals), 32) assert.Equal(t, len(dest[0].Rentals), 32)
assert.Equal(t, len(dest[1].Rentals), 27) assert.Equal(t, len(dest[1].Rentals), 27)
} }
func TestErrNoRows(t *testing.T) {
query := SELECT(Customer.AllColumns).FROM(Customer).WHERE(Customer.CustomerID.EQ(Int(-1)))
customer := model.Customer{}
err := query.Query(db, &customer)
assert.Error(t, err, sql.ErrNoRows.Error())
}