Replace #1044 #1935

Merged
lunny merged 6 commits from lunny/todb_nullable into master 2021-07-11 13:33:01 +00:00
4 changed files with 61 additions and 10 deletions

View File

@ -1396,15 +1396,22 @@ func TestNilFromDB(t *testing.T) {
assert.NoError(t, PrepareEngine()) assert.NoError(t, PrepareEngine())
assertSync(t, new(TestTable1)) assertSync(t, new(TestTable1))
cnt, err := testEngine.Insert(&TestTable1{ var tt0 = TestTable1{
Field1: &TestFieldType1{ Field1: &TestFieldType1{
cb: []byte("string"), cb: []byte("string"),
}, },
UpdateTime: time.Now(), UpdateTime: time.Now(),
}) }
cnt, err := testEngine.Insert(&tt0)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
var tt1 TestTable1
has, err := testEngine.ID(tt0.Id).Get(&tt1)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, "string", string(tt1.Field1.cb))
cnt, err = testEngine.Update(TestTable1{ cnt, err = testEngine.Update(TestTable1{
UpdateTime: time.Now().Add(time.Second), UpdateTime: time.Now().Add(time.Second),
}, TestTable1{ }, TestTable1{
@ -1418,4 +1425,37 @@ func TestNilFromDB(t *testing.T) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
var tt = TestTable1{
UpdateTime: time.Now(),
Field1: &TestFieldType1{
cb: nil,
},
}
cnt, err = testEngine.Insert(&tt)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var tt2 TestTable1
has, err = testEngine.ID(tt.Id).Get(&tt2)
assert.NoError(t, err)
assert.True(t, has)
assert.Nil(t, tt2.Field1)
var tt3 = TestTable1{
UpdateTime: time.Now(),
Field1: &TestFieldType1{
cb: []byte{},
},
}
cnt, err = testEngine.Insert(&tt3)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var tt4 TestTable1
has, err = testEngine.ID(tt3.Id).Get(&tt4)
assert.NoError(t, err)
assert.True(t, has)
assert.NotNil(t, tt4.Field1)
assert.NotNil(t, tt4.Field1.cb)
} }

View File

@ -127,8 +127,9 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value,
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if data != nil {
val = data val = data
}
goto APPEND goto APPEND
} }
} }
@ -138,8 +139,9 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value,
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if data != nil {
val = data val = data
}
goto APPEND goto APPEND
} }

View File

@ -31,6 +31,12 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl
if err != nil { if err != nil {
return nil, err return nil, err
} }
if data == nil {
if col.Nullable {
return nil, nil
}
data = []byte{}
}
if col.SQLType.IsBlob() { if col.SQLType.IsBlob() {
return data, nil return data, nil
} }
@ -45,12 +51,15 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl
if err != nil { if err != nil {
return nil, err return nil, err
} }
if data == nil {
if col.Nullable {
return nil, nil
}
data = []byte{}
}
if col.SQLType.IsBlob() { if col.SQLType.IsBlob() {
return data, nil return data, nil
} }
if nil == data {
return nil, nil
}
return string(data), nil return string(data), nil
} }
} }

View File

@ -768,7 +768,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
fieldValue, err := session.getField(dataStruct, key, table, idx) fieldValue, err := session.getField(dataStruct, key, table, idx)
if err != nil { if err != nil {
if !strings.Contains(err.Error(), "is not valid") { if _, ok := err.(ErrFieldIsNotValid); !ok {
session.engine.logger.Warnf("%v", err) session.engine.logger.Warnf("%v", err)
} }
continue continue