From 2bfe0b4d5e92dd9c93f2fd33c86b13838d8c0e25 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 13 Dec 2017 23:04:41 +0800 Subject: [PATCH] fix Get sql.Nullxx (#805) --- session_get.go | 8 ++++++++ session_get_test.go | 24 +++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/session_get.go b/session_get.go index 8faf53c0..68b37af7 100644 --- a/session_get.go +++ b/session_get.go @@ -5,6 +5,7 @@ package xorm import ( + "database/sql" "errors" "reflect" "strconv" @@ -79,6 +80,13 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, table *core.Table, bea return false, nil } + switch bean.(type) { + case sql.NullInt64, sql.NullBool, sql.NullFloat64, sql.NullString: + return true, rows.Scan(&bean) + case *sql.NullInt64, *sql.NullBool, *sql.NullFloat64, *sql.NullString: + return true, rows.Scan(bean) + } + switch beanKind { case reflect.Struct: fields, err := rows.Columns() diff --git a/session_get_test.go b/session_get_test.go index 571b8077..61398d1f 100644 --- a/session_get_test.go +++ b/session_get_test.go @@ -5,6 +5,7 @@ package xorm import ( + "database/sql" "fmt" "testing" "time" @@ -31,7 +32,7 @@ func TestGetVar(t *testing.T) { Age: 28, Money: 1.5, } - _, err := testEngine.InsertOne(data) + _, err := testEngine.InsertOne(&data) assert.NoError(t, err) var msg string @@ -55,6 +56,27 @@ func TestGetVar(t *testing.T) { assert.Equal(t, true, has) assert.EqualValues(t, 28, age2) + var id sql.NullInt64 + has, err = testEngine.Table("get_var").Cols("id").Get(&id) + assert.NoError(t, err) + assert.Equal(t, true, has) + assert.Equal(t, true, id.Valid) + assert.EqualValues(t, data.Id, id.Int64) + + var msgNull sql.NullString + has, err = testEngine.Table("get_var").Cols("msg").Get(&msgNull) + assert.NoError(t, err) + assert.Equal(t, true, has) + assert.Equal(t, true, msgNull.Valid) + assert.EqualValues(t, data.Msg, msgNull.String) + + var nullMoney sql.NullFloat64 + has, err = testEngine.Table("get_var").Cols("money").Get(&nullMoney) + assert.NoError(t, err) + assert.Equal(t, true, has) + assert.Equal(t, true, nullMoney.Valid) + assert.EqualValues(t, data.Money, nullMoney.Float64) + var money float64 has, err = testEngine.Table("get_var").Cols("money").Get(&money) assert.NoError(t, err)