| 71 | } |
| 72 | |
| 73 | func TestForeignKeyConstraints(t *testing.T) { |
| 74 | tidbSkip(t, "not support the foreign key feature") |
| 75 | |
| 76 | type Profile struct { |
| 77 | ID uint |
| 78 | Name string |
| 79 | MemberID uint |
| 80 | } |
| 81 | |
| 82 | type Member struct { |
| 83 | ID uint |
| 84 | Refer uint `gorm:"uniqueIndex"` |
| 85 | Name string |
| 86 | Profile Profile `gorm:"Constraint:OnUpdate:CASCADE,OnDelete:CASCADE;FOREIGNKEY:MemberID;References:Refer"` |
| 87 | } |
| 88 | |
| 89 | DB.Migrator().DropTable(&Profile{}, &Member{}) |
| 90 | |
| 91 | if err := DB.AutoMigrate(&Profile{}, &Member{}); err != nil { |
| 92 | t.Fatalf("Failed to migrate, got error: %v", err) |
| 93 | } |
| 94 | |
| 95 | member := Member{Refer: 1, Name: "foreign_key_constraints", Profile: Profile{Name: "my_profile"}} |
| 96 | |
| 97 | DB.Create(&member) |
| 98 | |
| 99 | var profile Profile |
| 100 | if err := DB.First(&profile, "id = ?", member.Profile.ID).Error; err != nil { |
| 101 | t.Fatalf("failed to find profile, got error: %v", err) |
| 102 | } else if profile.MemberID != member.ID { |
| 103 | t.Fatalf("member id is not equal: expects: %v, got: %v", member.ID, profile.MemberID) |
| 104 | } |
| 105 | |
| 106 | member.Profile = Profile{} |
| 107 | DB.Model(&member).Update("Refer", 100) |
| 108 | |
| 109 | var profile2 Profile |
| 110 | if err := DB.First(&profile2, "id = ?", profile.ID).Error; err != nil { |
| 111 | t.Fatalf("failed to find profile, got error: %v", err) |
| 112 | } else if profile2.MemberID != 100 { |
| 113 | t.Fatalf("member id is not equal: expects: %v, got: %v", 100, profile2.MemberID) |
| 114 | } |
| 115 | |
| 116 | if r := DB.Delete(&member); r.Error != nil || r.RowsAffected != 1 { |
| 117 | t.Fatalf("Should delete member, got error: %v, affected: %v", r.Error, r.RowsAffected) |
| 118 | } |
| 119 | |
| 120 | var result Member |
| 121 | if err := DB.First(&result, member.ID).Error; err == nil { |
| 122 | t.Fatalf("Should not find deleted member") |
| 123 | } |
| 124 | |
| 125 | if err := DB.First(&profile2, profile.ID).Error; err == nil { |
| 126 | t.Fatalf("Should not find deleted profile") |
| 127 | } |
| 128 | } |
| 129 | |
| 130 | func TestForeignKeyConstraintsBelongsTo(t *testing.T) { |