forked from mirror/gorm
parent
7da24d1d52
commit
da2b2861de
2
gorm.go
2
gorm.go
|
@ -37,6 +37,8 @@ type Config struct {
|
||||||
DisableAutomaticPing bool
|
DisableAutomaticPing bool
|
||||||
// DisableForeignKeyConstraintWhenMigrating
|
// DisableForeignKeyConstraintWhenMigrating
|
||||||
DisableForeignKeyConstraintWhenMigrating bool
|
DisableForeignKeyConstraintWhenMigrating bool
|
||||||
|
// IgnoreRelationshipsWhenMigrating
|
||||||
|
IgnoreRelationshipsWhenMigrating bool
|
||||||
// DisableNestedTransaction disable nested transaction
|
// DisableNestedTransaction disable nested transaction
|
||||||
DisableNestedTransaction bool
|
DisableNestedTransaction bool
|
||||||
// AllowGlobalUpdate allow global update
|
// AllowGlobalUpdate allow global update
|
||||||
|
|
|
@ -143,8 +143,11 @@ func (m Migrator) AutoMigrate(values ...interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating {
|
||||||
for _, rel := range stmt.Schema.Relationships.Relations {
|
for _, rel := range stmt.Schema.Relationships.Relations {
|
||||||
if !m.DB.Config.DisableForeignKeyConstraintWhenMigrating {
|
if rel.Field.IgnoreMigration {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if constraint := rel.ParseConstraint(); constraint != nil &&
|
if constraint := rel.ParseConstraint(); constraint != nil &&
|
||||||
constraint.Schema == stmt.Schema && !queryTx.Migrator().HasConstraint(value, constraint.Name) {
|
constraint.Schema == stmt.Schema && !queryTx.Migrator().HasConstraint(value, constraint.Name) {
|
||||||
if err := execTx.Migrator().CreateConstraint(value, constraint.Name); err != nil {
|
if err := execTx.Migrator().CreateConstraint(value, constraint.Name); err != nil {
|
||||||
|
@ -244,8 +247,11 @@ func (m Migrator) CreateTable(values ...interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating {
|
||||||
for _, rel := range stmt.Schema.Relationships.Relations {
|
for _, rel := range stmt.Schema.Relationships.Relations {
|
||||||
if !m.DB.DisableForeignKeyConstraintWhenMigrating {
|
if rel.Field.IgnoreMigration {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if constraint := rel.ParseConstraint(); constraint != nil {
|
if constraint := rel.ParseConstraint(); constraint != nil {
|
||||||
if constraint.Schema == stmt.Schema {
|
if constraint.Schema == stmt.Schema {
|
||||||
sql, vars := buildConstraint(constraint)
|
sql, vars := buildConstraint(constraint)
|
||||||
|
@ -818,7 +824,11 @@ func (m Migrator) ReorderModels(values []interface{}, autoAdd bool) (results []i
|
||||||
}
|
}
|
||||||
parsedSchemas[dep.Statement.Schema] = true
|
parsedSchemas[dep.Statement.Schema] = true
|
||||||
|
|
||||||
|
if !m.DB.IgnoreRelationshipsWhenMigrating {
|
||||||
for _, rel := range dep.Schema.Relationships.Relations {
|
for _, rel := range dep.Schema.Relationships.Relations {
|
||||||
|
if rel.Field.IgnoreMigration {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if c := rel.ParseConstraint(); c != nil && c.Schema == dep.Statement.Schema && c.Schema != c.ReferenceSchema {
|
if c := rel.ParseConstraint(); c != nil && c.Schema == dep.Statement.Schema && c.Schema != c.ReferenceSchema {
|
||||||
dep.Depends = append(dep.Depends, c.ReferenceSchema)
|
dep.Depends = append(dep.Depends, c.ReferenceSchema)
|
||||||
}
|
}
|
||||||
|
@ -840,6 +850,7 @@ func (m Migrator) ReorderModels(values []interface{}, autoAdd bool) (results []i
|
||||||
}(rel, reflect.New(rel.JoinTable.ModelType).Interface())
|
}(rel, reflect.New(rel.JoinTable.ModelType).Interface())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
valuesMap[dep.Schema.Table] = dep
|
valuesMap[dep.Schema.Table] = dep
|
||||||
|
|
||||||
|
|
|
@ -1203,3 +1203,67 @@ func TestMigrateSameEmbeddedFieldName(t *testing.T) {
|
||||||
_, err = findColumnType(&GameUser{}, "rate_ground_rb_ground_destory_count")
|
_, err = findColumnType(&GameUser{}, "rate_ground_rb_ground_destory_count")
|
||||||
AssertEqual(t, nil, err)
|
AssertEqual(t, nil, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMigrateIgnoreRelations(t *testing.T) {
|
||||||
|
type RelationModel1 struct {
|
||||||
|
ID uint
|
||||||
|
}
|
||||||
|
type RelationModel2 struct {
|
||||||
|
ID uint
|
||||||
|
}
|
||||||
|
type RelationModel3 struct {
|
||||||
|
ID uint
|
||||||
|
RelationModel1ID uint
|
||||||
|
RelationModel1 *RelationModel1
|
||||||
|
RelationModel2ID uint
|
||||||
|
RelationModel2 *RelationModel2 `gorm:"-:migration"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
_ = DB.Migrator().DropTable(&RelationModel1{}, &RelationModel2{}, &RelationModel3{})
|
||||||
|
|
||||||
|
tx := DB.Session(&gorm.Session{})
|
||||||
|
tx.IgnoreRelationshipsWhenMigrating = true
|
||||||
|
|
||||||
|
err = tx.AutoMigrate(&RelationModel3{})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("AutoMigrate err:%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RelationModel3 should be existed
|
||||||
|
_, err = findColumnType(&RelationModel3{}, "id")
|
||||||
|
AssertEqual(t, nil, err)
|
||||||
|
|
||||||
|
// RelationModel1 should not be existed
|
||||||
|
_, err = findColumnType(&RelationModel1{}, "id")
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("RelationModel1 should not be migrated")
|
||||||
|
}
|
||||||
|
|
||||||
|
// RelationModel2 should not be existed
|
||||||
|
_, err = findColumnType(&RelationModel2{}, "id")
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("RelationModel2 should not be migrated")
|
||||||
|
}
|
||||||
|
|
||||||
|
tx.IgnoreRelationshipsWhenMigrating = false
|
||||||
|
|
||||||
|
err = tx.AutoMigrate(&RelationModel3{})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("AutoMigrate err:%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RelationModel3 should be existed
|
||||||
|
_, err = findColumnType(&RelationModel3{}, "id")
|
||||||
|
AssertEqual(t, nil, err)
|
||||||
|
|
||||||
|
// RelationModel1 should be existed
|
||||||
|
_, err = findColumnType(&RelationModel1{}, "id")
|
||||||
|
AssertEqual(t, nil, err)
|
||||||
|
|
||||||
|
// RelationModel2 should not be existed
|
||||||
|
_, err = findColumnType(&RelationModel2{}, "id")
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("RelationModel2 should not be migrated")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue