mirror of https://github.com/go-gorm/gorm.git
fix(create): fix insert column order (#6855)
* fix(create): fix insert column order * chore: add ConvertToCreateValues ut for Slice case * fix: remvoe testify dependency --------- Co-authored-by: lujinghao <lujinghao@bytedance.com>
This commit is contained in:
parent
ab89d54d87
commit
f7ebf049da
|
@ -293,13 +293,15 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
|
|||
}
|
||||
}
|
||||
|
||||
for field, vs := range defaultValueFieldsHavingValue {
|
||||
values.Columns = append(values.Columns, clause.Column{Name: field.DBName})
|
||||
for idx := range values.Values {
|
||||
if vs[idx] == nil {
|
||||
values.Values[idx] = append(values.Values[idx], stmt.Dialector.DefaultValueOf(field))
|
||||
} else {
|
||||
values.Values[idx] = append(values.Values[idx], vs[idx])
|
||||
for _, field := range stmt.Schema.FieldsWithDefaultDBValue {
|
||||
if vs, ok := defaultValueFieldsHavingValue[field]; ok {
|
||||
values.Columns = append(values.Columns, clause.Column{Name: field.DBName})
|
||||
for idx := range values.Values {
|
||||
if vs[idx] == nil {
|
||||
values.Values[idx] = append(values.Values[idx], stmt.Dialector.DefaultValueOf(field))
|
||||
} else {
|
||||
values.Values[idx] = append(values.Values[idx], vs[idx])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
package callbacks
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
)
|
||||
|
||||
var schemaCache = &sync.Map{}
|
||||
|
||||
func TestConvertToCreateValues_DestType_Slice(t *testing.T) {
|
||||
type user struct {
|
||||
ID int `gorm:"primaryKey"`
|
||||
Name string
|
||||
Email string `gorm:"default:(-)"`
|
||||
Age int `gorm:"default:(-)"`
|
||||
}
|
||||
|
||||
s, err := schema.Parse(&user{}, schemaCache, schema.NamingStrategy{})
|
||||
if err != nil {
|
||||
t.Errorf("parse schema error: %v, is not expected", err)
|
||||
return
|
||||
}
|
||||
dest := []*user{
|
||||
{
|
||||
ID: 1,
|
||||
Name: "alice",
|
||||
Email: "email",
|
||||
Age: 18,
|
||||
},
|
||||
{
|
||||
ID: 2,
|
||||
Name: "bob",
|
||||
Email: "email",
|
||||
Age: 19,
|
||||
},
|
||||
}
|
||||
stmt := &gorm.Statement{
|
||||
DB: &gorm.DB{
|
||||
Config: &gorm.Config{
|
||||
NowFunc: func() time.Time { return time.Time{} },
|
||||
},
|
||||
Statement: &gorm.Statement{
|
||||
Settings: sync.Map{},
|
||||
Schema: s,
|
||||
},
|
||||
},
|
||||
ReflectValue: reflect.ValueOf(dest),
|
||||
Dest: dest,
|
||||
}
|
||||
|
||||
stmt.Schema = s
|
||||
|
||||
values := ConvertToCreateValues(stmt)
|
||||
expected := clause.Values{
|
||||
// column has value + defaultValue column has value (which should have a stable order)
|
||||
Columns: []clause.Column{{Name: "name"}, {Name: "email"}, {Name: "age"}, {Name: "id"}},
|
||||
Values: [][]interface{}{
|
||||
{"alice", "email", 18, 1},
|
||||
{"bob", "email", 19, 2},
|
||||
},
|
||||
}
|
||||
if !reflect.DeepEqual(expected, values) {
|
||||
t.Errorf("expected: %v got %v", expected, values)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue