0

我想使用 gorm AutoMigrate 从 CSV 文件插入数据库,并且在插入时我想避免重复输入。我怎样才能做到这一点?请检查随附的代码。

type User struct {
    gorm.Model

    ID                           int64  `csv:"_" db:"id"`
    FirstName                    string `csv:"First name" db:"first_name"`
    LastName                     string `csv:"Last name" db:"last_name"`
    Emails                       string `csv:"Emails" db:"emails"`
}

func main() {
    file, err := os.Open(os.Args[1])
    defer file.Close()
    users := []User{}
    err = gocsv.Unmarshal(file, &users)
    db, err := gorm.Open(postgres.Open("host=xxx.xx.x.x user=database password=password dbname=database port=5432 sslmode=disable"))

    err = db.AutoMigrate(&User{})
    if err != nil {
        panic(err)
    }

    result := db.Create(users)
    if result.Error != nil {
        panic(result.Error)
    }
}

示例:考虑以下数据

电子邮件
第一的 姓名 first@example.com
第二 姓名 second@example.com
第三 姓名
向前 姓名 first@example.com

如果我们传递上面的数据,前 3 行应该插入到数据库中,即我们必须避免重复的电子邮件条目到数据库中。谢谢。

注意:如果电子邮件为空,则应将该行插入数据库。

4

1 回答 1

0

您必须在之后清理“用户”err = gocsv.Unmarshal(file, &users)

有人想像

func sanytize(arr []User) []User {
   users := []User{}
   mail := []string{}
   for _, a := range arr {
       if !contains(mail, a.Emails){
           users = append(users, a)
       }
       mail = append(mail, a.Emails)
       
   }
   
   return users
}

func contains(arr []string, str string) bool {
   for _, a := range arr {
      if a == str {
         return true
      }
   }
   return false
}

....

err = gocsv.Unmarshal(file, &users)
users = sanytize(users)
于 2021-09-24T11:41:06.130 回答