如何使用gorm更新sql中的嵌套表?

问题描述 投票:0回答:2

这里的代码是用Go编写的。我正在使用两个表,其中一个表具有引用另一个表的主键的外键。假设我有一个定义如下结构的数据库:

   type User struct{
       ID uint `gorm:"primary_key;column:id"`
       Name string `gorm:"column:name"`
       Place place
       PlaceID
   }

   type Place struct{
       ID uint `gorm:"primary_key;column:id"`
       Name string `gorm:"column:name"`
       Pincode uint `gorm:"column:pincode"`
   }

SQL 架构是:

create table place(
    id int(20) NOT NULL AUTO_INCREMENT,
    name varchar(100) NOT NULL,
    pincode uint(20) NOT NULL,
    PRIMARY KEY (id),
)

create table user(
    id int(20) NOT NULL AUTO_INCREMENT,
    name varchar(100) NOT NULL,
    place_id uint(20) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (place_id) REFERENCES place(id)
)

现在,当 gorm 插入用户时:

  place := Place{Name:"new delhi",Pincode:1234}
  user := User{Name: "sam", Age: 15, Place: place}
  err = db.Debug().Create(&user).Error

  //It  inserts to both user and place table in mysql
  //now while updating to name in user table as Samuel and place as 
  //following

  place := Place{Name:"mumbai",Pincode:1234}
  err = db.Debug().Model(&User{}).Where("id =?", 
   1,).Update(&user{Name:"Samuel",Place:place}).Error

它更新用户表中的行,但在位置表中创建一个新行。但它应该更新位置表中的匹配行而不是创建新行

有什么办法可以做到吗?这里我没有使用自动迁移功能来创建数据库表。

sql go foreign-keys one-to-one go-gorm
2个回答
1
投票

您的问题的答案应该在关系或关联模式中寻求。 下面的示例展示了如何为 多对多有很多添加新关联,替换 有一个属于

的当前关联
db.Model(&user).Association("Place").Append(Place{Name:"mumbai",Pincode:1234})

或者您可以用新的关联替换当前关联:

db.Model(&user).Association("Place").Replace(Place{Name:"mumbai",Pincode:1234},Place{Name:"new delhi",Pincode:1234})

0
投票

可能正在创建一个新行,因为您没有在

Place{Name:"mumbai",Pincode:1234}
上设置 ID。

© www.soinside.com 2019 - 2024. All rights reserved.