1
0

v24.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package migrations
  2. import (
  3. "fmt"
  4. gouuid "github.com/satori/go.uuid"
  5. "gorm.io/gorm"
  6. )
  7. func addUserLocalEmail(db *gorm.DB) error {
  8. type User struct {
  9. ID int64 `gorm:"primaryKey"`
  10. LocalEmail string
  11. }
  12. type UserNotNULL struct {
  13. ID int64 `gorm:"primaryKey"`
  14. LocalEmail string
  15. }
  16. if db.Migrator().HasColumn(&User{}, "LocalEmail") {
  17. return errMigrationSkipped
  18. }
  19. return db.Transaction(func(tx *gorm.DB) error {
  20. err := tx.Migrator().AddColumn(&User{}, "LocalEmail")
  21. if err != nil {
  22. return fmt.Errorf("add column user.local_email error: %s", err.Error())
  23. }
  24. const limit = 100
  25. for {
  26. var res []User
  27. err := tx.Table("user").Where("type = ?", 0).Where("local_email = ''").Limit(limit).Find(&res).Error
  28. if err != nil {
  29. return fmt.Errorf("query user error: %s", err.Error())
  30. }
  31. for _, r := range res {
  32. r.LocalEmail = gouuid.NewV4().String() + "@fake.localhost"
  33. err = tx.Save(&r).Error
  34. if err != nil {
  35. return fmt.Errorf("save column user.local_email error: %s", err)
  36. }
  37. }
  38. if len(res) < limit {
  39. break
  40. }
  41. }
  42. err = tx.Migrator().AlterColumn(&User{}, "LocalEmail")
  43. if err != nil {
  44. return fmt.Errorf("alter column user.local_email error: %s", err.Error())
  45. }
  46. return nil
  47. })
  48. }