有志者,事竟成!如果你在学习golang,那么本文《通过返回切片的值来更新 GORM 中的记录?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~
问题内容
在创建 cli 应用程序时,我遇到了使用 Gorm 批量保存数据的问题。
具体来说,使用包含要保存为多对多关系的值的切片。
命令 eddie track mood -q 9 --tags=one,two, three,four -i 会像这样创建静态良好的内容:
two := &schema.record{
type: "mood",
quality: 9,
tags: []schema.tag{
{name: "one"},{name: "two"},{name: "three"},{name: "four"},
},
important: false,
}
但是...使用 for/range 循环,我只选取最后一个(我想这是显而易见的原因),因此 db.create(&two) 返回一个标签,而不是多个。
var t []schema.Tag
for _, v := range tags {
t = []schema.Tag{{Name: v}}
}
r := &schema.Record{
Type: "mood",
Quality: q,
Tags: t,
Important: i,
}
database.Create(&r)
fmt.Printf("You rated your mood a %d.\n", q)
fmt.Println("Record ID:", r.ID)
fmt.Println("Tags:", r.Tags)
return err
You rated your mood a 9.
Record ID: 11
Tags: [{four}]
我考虑过的事情:
我不想将“一、二、三、四”保存为单个输入,稍后解析
批量更新不会保留 id、关系(键),因此(根据我的理解)这应该是单个 db.create() 或使用省略,然后立即更新
我是 go 新手(过去 8 年的 PHP 开发人员),所以我需要一些帮助!
我的结构设置可能不正确?
返回切片值时如何批量更新 gorm 中的记录?
解决方案
目前,我相信我已经找到了解决办法。
func parse(t []string) []schema.tag {
var tags []schema.tag
for i := 0; i < len(t); i++ {
tag := []schema.tag{{name: t[i]}}
tags = append(tags, tag...)
}
return tags
}
这给了我以下输出:
You rated your mood a 9.
Record ID: 28
Tags: [{Stackoverflow} {Code} {SNL} {IASIP} {Excited}]
如果有人有任何要补充的内容,希望能得到一些额外的帮助或讨论。