这里的代码是用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
它更新用户表中的行,但在位置表中创建一个新行。但它应该更新位置表中的匹配行而不是创建新行
有什么办法可以做到吗?这里我没有使用自动迁移功能来创建数据库表。
您的问题的答案应该在关系或关联模式中寻求。 下面的示例展示了如何为 多对多、有很多添加新关联,替换 有一个、属于
的当前关联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})
可能正在创建一个新行,因为您没有在
Place{Name:"mumbai",Pincode:1234}
上设置 ID。