fix: scan array
This commit is contained in:
parent
8c3018b96a
commit
7b38a65037
12
scan.go
12
scan.go
@ -243,11 +243,14 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
|
|||||||
case reflect.Slice, reflect.Array:
|
case reflect.Slice, reflect.Array:
|
||||||
var elem reflect.Value
|
var elem reflect.Value
|
||||||
recyclableStruct := reflect.New(reflectValueType)
|
recyclableStruct := reflect.New(reflectValueType)
|
||||||
|
isArrayKind := reflectValue.Kind() == reflect.Array
|
||||||
|
|
||||||
if !update || reflectValue.Len() == 0 {
|
if !update || reflectValue.Len() == 0 {
|
||||||
update = false
|
update = false
|
||||||
|
if !isArrayKind {
|
||||||
db.Statement.ReflectValue.Set(reflect.MakeSlice(reflectValue.Type(), 0, 20))
|
db.Statement.ReflectValue.Set(reflect.MakeSlice(reflectValue.Type(), 0, 20))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for initialized || rows.Next() {
|
for initialized || rows.Next() {
|
||||||
BEGIN:
|
BEGIN:
|
||||||
@ -277,10 +280,15 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
|
|||||||
db.scanIntoStruct(rows, elem, values, fields, joinFields)
|
db.scanIntoStruct(rows, elem, values, fields, joinFields)
|
||||||
|
|
||||||
if !update {
|
if !update {
|
||||||
if isPtr {
|
if !isPtr {
|
||||||
|
elem = elem.Elem()
|
||||||
|
}
|
||||||
|
if !isArrayKind {
|
||||||
reflectValue = reflect.Append(reflectValue, elem)
|
reflectValue = reflect.Append(reflectValue, elem)
|
||||||
} else {
|
} else {
|
||||||
reflectValue = reflect.Append(reflectValue, elem.Elem())
|
if reflectValue.Len() >= int(db.RowsAffected) {
|
||||||
|
reflectValue.Index(int(db.RowsAffected - 1)).Set(elem)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -216,6 +216,30 @@ func TestFind(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test array
|
||||||
|
var models2 [3]User
|
||||||
|
if err := DB.Where("name in (?)", []string{"find"}).Find(&models2).Error; err != nil || len(models2) != 3 {
|
||||||
|
t.Errorf("errors happened when query find with in clause: %v, length: %v", err, len(models2))
|
||||||
|
} else {
|
||||||
|
for idx, user := range users {
|
||||||
|
t.Run("FindWithInClause#"+strconv.Itoa(idx+1), func(t *testing.T) {
|
||||||
|
CheckUser(t, models2[idx], user)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// test smaller array
|
||||||
|
var models3 [2]User
|
||||||
|
if err := DB.Where("name in (?)", []string{"find"}).Find(&models3).Error; err != nil || len(models3) != 2 {
|
||||||
|
t.Errorf("errors happened when query find with in clause: %v, length: %v", err, len(models3))
|
||||||
|
} else {
|
||||||
|
for idx, user := range users[:2] {
|
||||||
|
t.Run("FindWithInClause#"+strconv.Itoa(idx+1), func(t *testing.T) {
|
||||||
|
CheckUser(t, models3[idx], user)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var none []User
|
var none []User
|
||||||
if err := DB.Where("name in (?)", []string{}).Find(&none).Error; err != nil || len(none) != 0 {
|
if err := DB.Where("name in (?)", []string{}).Find(&none).Error; err != nil || len(none) != 0 {
|
||||||
t.Errorf("errors happened when query find with in clause and zero length parameter: %v, length: %v", err, len(none))
|
t.Errorf("errors happened when query find with in clause and zero length parameter: %v, length: %v", err, len(none))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user