only postgres, gaussdb, sqlserver, sqlite support update from
(t *testing.T)
| 885 | |
| 886 | // only postgres, gaussdb, sqlserver, sqlite support update from |
| 887 | func TestUpdateFrom(t *testing.T) { |
| 888 | if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "gaussdb" && DB.Dialector.Name() != "sqlite" && DB.Dialector.Name() != "sqlserver" { |
| 889 | return |
| 890 | } |
| 891 | |
| 892 | users := []*User{ |
| 893 | GetUser("update-from-1", Config{Account: true}), |
| 894 | GetUser("update-from-2", Config{Account: true}), |
| 895 | GetUser("update-from-3", Config{}), |
| 896 | } |
| 897 | |
| 898 | if err := DB.Create(&users).Error; err != nil { |
| 899 | t.Fatalf("errors happened when create: %v", err) |
| 900 | } else if users[0].ID == 0 { |
| 901 | t.Fatalf("user's primary value should not zero, %v", users[0].ID) |
| 902 | } else if users[0].UpdatedAt.IsZero() { |
| 903 | t.Fatalf("user's updated at should not zero, %v", users[0].UpdatedAt) |
| 904 | } |
| 905 | |
| 906 | if rowsAffected := DB.Model(&User{}).Clauses(clause.From{Tables: []clause.Table{{Name: "accounts"}}}).Where("accounts.user_id = users.id AND accounts.number = ? AND accounts.deleted_at IS NULL", users[0].Account.Number).Update("name", "franco").RowsAffected; rowsAffected != 1 { |
| 907 | t.Errorf("should only update one record, but got %v", rowsAffected) |
| 908 | } |
| 909 | |
| 910 | var result User |
| 911 | if err := DB.Where("id = ?", users[0].ID).First(&result).Error; err != nil { |
| 912 | t.Errorf("errors happened when query before user: %v", err) |
| 913 | } else if result.UpdatedAt.UnixNano() == users[0].UpdatedAt.UnixNano() { |
| 914 | t.Errorf("user's updated at should be changed, but got %v, was %v", result.UpdatedAt, users[0].UpdatedAt) |
| 915 | } else if result.Name != "franco" { |
| 916 | t.Errorf("user's name should be updated") |
| 917 | } |
| 918 | |
| 919 | if rowsAffected := DB.Model(&User{}).Clauses(clause.From{Tables: []clause.Table{{Name: "accounts"}}}).Where("accounts.user_id = users.id AND accounts.number IN ? AND accounts.deleted_at IS NULL", []string{users[0].Account.Number, users[1].Account.Number}).Update("name", gorm.Expr("accounts.number")).RowsAffected; rowsAffected != 2 { |
| 920 | t.Errorf("should update two records, but got %v", rowsAffected) |
| 921 | } |
| 922 | |
| 923 | var results []User |
| 924 | if err := DB.Preload("Account").Find(&results, []uint{users[0].ID, users[1].ID}).Error; err != nil { |
| 925 | t.Errorf("Not error should happen when finding users, but got %v", err) |
| 926 | } |
| 927 | |
| 928 | for _, user := range results { |
| 929 | if user.Name != user.Account.Number { |
| 930 | t.Errorf("user's name should be equal to the account's number %v, but got %v", user.Account.Number, user.Name) |
| 931 | } |
| 932 | } |
| 933 | } |