fix(create): create multiple pieces of data, primary key value is incorrectly backfilled

This commit is contained in:
demoManito 2024-03-16 18:10:27 +08:00
parent 7b1fb0bd73
commit 56fce98cbc
3 changed files with 53 additions and 3 deletions

View File

@ -175,9 +175,33 @@ func Create(config *Config) func(db *gorm.DB) {
break
}
if _, isZero := pkField.ValueOf(db.Statement.Context, rv); isZero {
if field, isZero := pkField.ValueOf(db.Statement.Context, rv); isZero {
db.AddError(pkField.Set(db.Statement.Context, rv, insertID))
insertID += pkField.AutoIncrementIncrement
} else {
// If the primary key is set, the next primary key value is incremented from that primary key
switch f := field.(type) {
case int:
insertID = int64(f) + pkField.AutoIncrementIncrement
case int8:
insertID = int64(f) + pkField.AutoIncrementIncrement
case int16:
insertID = int64(f) + pkField.AutoIncrementIncrement
case int32:
insertID = int64(f) + pkField.AutoIncrementIncrement
case int64:
insertID = f + pkField.AutoIncrementIncrement
case uint:
insertID = int64(f) + pkField.AutoIncrementIncrement
case uint8:
insertID = int64(f) + pkField.AutoIncrementIncrement
case uint16:
insertID = int64(f) + pkField.AutoIncrementIncrement
case uint32:
insertID = int64(f) + pkField.AutoIncrementIncrement
case uint64:
insertID = int64(f) + pkField.AutoIncrementIncrement
}
}
}
}

View File

@ -471,8 +471,7 @@ func (field *Field) setupValuerAndSetter() {
}
}
fv, zero := v.Interface(), v.IsZero()
return fv, zero
return v.Interface(), v.IsZero()
}
}

View File

@ -793,3 +793,30 @@ func TestCreateFromMapWithTable(t *testing.T) {
t.Fatal("failed to create data from map with table, @id != id")
}
}
func TestCreateWithSliceWritebackPrimaryKey(t *testing.T) {
users := []*User{
{
Age: 20,
},
{
Model: gorm.Model{
ID: 100000,
},
Age: 21,
},
{
Age: 22,
},
}
err := DB.Create(users).Error
if err != nil {
t.Fatal(err)
}
if users[1].ID != 100000 {
t.Errorf("users[1].ID should be 100000, but got %v", users[1].ID)
}
if users[2].ID != users[1].ID+1 {
t.Errorf("failed to write back primary key, users[2].ID should be %v, but got %v, %v", users[1].ID+1, users[2].ID, users[0].ID)
}
}