gpt4 book ai didi

postgresql - 更新字段创建新的外键项而不是更新它们

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:56 25 4
gpt4 key购买 nike

我有一个一对一的关系,位置,使用 postgresql:

type App struct {
gorm.Model

PersoID string `gorm:"primary_key;unique" json:"perso_id"`

Location OllyLocation `gorm:"foreignkey:location_id"`
LocationID *uint `json:"-" gorm:"type:integer REFERENCES locations(id)"`

Users []User `json:"users,omitempty" gorm:"many2many:app_users;"`
}

type Location struct {
ID uint `json:"-" gorm:"primary_key;unique"`
CreatedAt time.Time `json:"-"`
UpdatedAt time.Time

Lat float64 `json:"lat"`
Long float64 `json:"long"`
Address string `json:"address"`
Country string `json:"country"`
}

但如您所见,App 结构有自己的主键 ID 作为字符串(和 GORM 一样)。因此,此 block 无法从 gorm 执行简单的 db.Save()

所以我尝试过:

func (previousModel *App) UpdateAndReturnedUpdated(db *gorm.DB, appUpdated *App) error {
if err := db.Model(previousModel).Update(appUpdated).Error; err != nil {
return err
}

return db.Preload("Location").First(previousModel, App{PersoID: appUpdated.PersoID}).Error
}

有了这个,应用程序就正确更新了——太棒了! - 但不是位置。

使用新值在数据库中重新创建位置,并在 App 上更新 foreignKey LocationID。

这非常烦人,因为如果我只想更新地址而不指定其他字段,它们只会使用原始类型值重新创建(纬度/经度将为 0)

关于如何更新外键有什么想法吗?谢谢!

最佳答案

您可以使用它来修改关联的实体

db.Set("gorm:save_associations", false).保存(previousModel)

或者只保存结构的一个字段

db.Model(previousModel).UpdateColumn("PersoID", appUpdated.PersoID)

如果你想更新关联的实体而不是关系您将需要更新实体本身

db.Model(Location{ID:*previousModel.LocationID}).Update(appUpdated.Location)

关于postgresql - 更新字段创建新的外键项而不是更新它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51947674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com