【问题标题】:Update HasMany Association failing Gorm更新 HasMany 关联失败的 Gorm
【发布时间】:2021-10-12 09:12:10
【问题描述】:

当我尝试使用数据更新 Shoppinglist 结构时,我收到“没有与 ON CONFLICT 规范 (SQLSTATE 42P10) 匹配的唯一或排除约束”错误

这些是我的结构

type Shoppinglist struct {
    Model

    ID           int            `gorm:"primaryKey" json:"id"`
    Title        string         `json:"title"`
    Items        []Item         `json:"items" gorm:"foreignKey:ParentListID;references:ID;"`
    Owner        string         `json:"owner"`
    Participants pq.StringArray `gorm:"type:text[]" json:"participants"`
}

type Item struct {
    Model

    ParentListID int    `gorm:"primaryKey" json:"parentListId"`
    Title        string `json:"title"`
    Position     int    `json:"position"`
    Bought       bool   `json:"bought"`
}

这是我尝试编辑列表时执行的代码

func EditList(id int, data map[string]interface{}) error {
    //https://github.com/go-gorm/gorm/issues/3487

    shoppinglist := Shoppinglist{
        ID:           data["id"].(int),
        Title:        data["title"].(string),
        Items:        data["items"].([]Item),
        Owner:        data["owner"].(string),
        Participants: data["participants"].([]string),
    }

    if err := db.Session(&gorm.Session{FullSaveAssociations: true}).Where("id = ?", id).Updates(&shoppinglist).Error; err != nil {
        return err
    }

    return nil
}

这是我执行 EditList 并设置所有值以传递 nito 地图的地方:

type Shoppinglist struct {
    ID           int
    Title        string
    Items        []models.Item
    Owner        string
    Participants []string
    PageNum      int
    PageSize     int
}

func (s *Shoppinglist) Edit() error {
    shoppinglist := map[string]interface{}{
        "id":           s.ID,
        "title":        s.Title,
        "items":        s.Items,
        "owner":        s.Owner,
        "participants": s.Participants,
    }

    return models.EditList(s.ID, shoppinglist)
}

在我只使用 []string 而不是 []Item 之前,它运行良好。现在除了 []Item

之外的所有内容都更新了

这些是执行的 SQL 查询:

UPDATE "shoppinglists" SET "modified_on"=1628251977096,"title"='kjhdsfgnb',"owner"='janburzinski1@gmail.com',"participants"='{}' WHERE id = 517687 AND "id" = 517687

INSERT INTO "items" ("created_on","modified_on","deleted_at","title","position","bought","parent_list_id") VALUES (1628251977,1628251977116,NULL,'dfkjhgndfjkg',1,false,517687),(1628251977,1628251977116,NULL,'dfgh123',2,true,517687) ON CONFLICT ("parent_list_id") DO UPDATE SET "created_on"="excluded"."created_on","modified_on"="excluded"."modified_on","deleted_at"="excluded"."deleted_at","title"="excluded"."title","position"="excluded"."position","bought"="excluded"."bought" RETURNING "parent_list_id"

我真的很想知道如何在 Gorm 中更新关系,或者为什么这不起作用,因为我一直在查看 Github 和 Stackoverflow 上的所有关联问题,但没有找到适合我的答案。

【问题讨论】:

    标签: postgresql go associations go-gorm


    【解决方案1】:

    我在这里看到的第一个问题是您的 Item 没有 ID,但使用 ParentListID 作为主键。这意味着您只能为每个父项拥有一个 Item,这违背了拥有数组的目的。

    为项目创建一个 ID 字段(用作主键),如果您的方法仍然存在问题,请更新问题。

    PS:本来可以在评论中留下这个,但不能。

    【讨论】:

      【解决方案2】:

      我只需要将 * 添加到 []Item 并修复主键问题并删除引用。

      type Shoppinglist struct {
          Model
      
          ID           int            `gorm:"primaryKey" json:"id"`
          Title        string         `json:"title"`
          Items        []*Item        `json:"items" gorm:"foreignKey:ParentListID;"`
          Owner        string         `json:"owner"`
          Participants pq.StringArray `gorm:"type:text[]" json:"participants"`
      }
      
      type Item struct {
          Model
      
          ID           int    `gorm:"primaryKey" json:"id"`
          ParentListID int    `json:"parentListId"`
          ItemID       int    `json:"itemId"`
          Title        string `json:"title"`
          Position     int    `json:"position"`
          Bought       bool   `json:"bought" gorm:"default:false"`
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多