为了账号安全,请及时绑定邮箱和手机立即绑定

GORM 外键似乎没有添加适当的字段

GORM 外键似乎没有添加适当的字段

Go
慕标5832272 2023-02-21 16:50:45
我有以下模型:type Drink struct {    gorm.Model           // Adds some metadata fields to the table    ID         uuid.UUID `gorm:"type:uuid;primary key"`    Name       string    `gorm:"index;not null;"`    Volume     float64   `gorm:"not null;type:decimal(10,2)"`    ABV        float64   `gorm:"not null;type:decimal(10,2);"`    Price      float64   `gorm:"not null;type:decimal(10,2);"`    Location   Location  `gorm:"ForeignKey:DrinkID;"`}type Location struct {    gorm.Model           // Adds some metadata fields to the table    ID         uuid.UUID `gorm:"primary key;type:uuid"`    DrinkID    uuid.UUID    Name       string `gorm:"not null;"`    Address    string `gorm:"not null;type:decimal(10,2)"`    Phone      int    `gorm:"not null;type:decimal(10,0);"`}但是,当我运行该程序时,它会添加两个表,但是 Drink 表中没有位置字段。迁移后我的数据库看起来像这样,不管我之前是否删除过表:我有一种潜移默化的感觉,这可能是因为我没有使用 gorm 默认 ID,但如果是这种情况,谁能告诉我如何用 UUID 而不是 uint 以正确的方式覆盖默认 ID?或者,如果这甚至不是问题,拜托,我已经为此工作了几天,我真的不想走仅使用 gorm 提供的默认设置的“简单”道路,我实际上想了解什么在这里进行以及如何正确地做我想做的事情。运行 API 时我没有收到任何错误,并且迁移似乎也在运行,只是我定义的字段实际上没有显示在数据库中,这意味着前端将无法正确添加数据。我想在这里发生的是在前端提供一个商店列表,当用户添加饮料时,他们将不得不从该商店列表中进行选择。添加的每种饮料只能有 1 个商店,因为不同商店的饮料价格会有所不同。所以从技术上讲,饮料桌上会有很多“重复”的饮料,但连接到不同的位置。
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

  • 第一点是因为您正在使用自定义主键,所以您不应该使用它gorm.Model,因为它包含ID字段。参考

  • 第二点根据你的描述,store(location) 和 是一对多的关系drink。这意味着一家商店可以有多种饮料,但一种饮料应该只属于一家商店。在one-to-many 关系中,旁边应该有一个参考或关系 ID many 。这意味着你在drink表中的情况。那么你的结构应该是这样的:

我的模型结构

type MyModel struct {

  CreatedAt time.Time

  UpdatedAt time.Time

  DeletedAt gorm.DeletedAt `gorm:"index"`

}

位置结构(商店)

type Location struct {

    MyModel

    ID         uuid.UUID `gorm:"primary key;type:uuid"`

    // other columns...

    Drinks     []Drink 

}

饮料结构

type Drink struct {

    MyModel

    ID         uuid.UUID `gorm:"type:uuid;primary key"`

    //other columns...

    LocationID   uuid.UUID// This is important

}

然后gorm会自动考虑drink表中的 LocationID 将引用位置表的 ID 字段。您还可以在 Location 结构的 Drinks 数组字段中明确指示它使用 gorm gorm:"foreignKey:LocationID;references:ID"



查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信