Add QRM error if result set is empty when scanning into struct destination.
This commit is contained in:
parent
02fafd8a7a
commit
8c9ae77cd8
6 changed files with 61 additions and 22 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue