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

我有以下模型:


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 表中没有位置字段。迁移后我的数据库看起来像这样,不管我之前是否删除过表:

http://img1.mukewang.com/63f485fb0001889d04710790.jpg

我有一种潜移默化的感觉,这可能是因为我没有使用 gorm 默认 ID,但如果是这种情况,谁能告诉我如何用 UUID 而不是 uint 以正确的方式覆盖默认 ID?或者,如果这甚至不是问题,拜托,我已经为此工作了几天,我真的不想走仅使用 gorm 提供的默认设置的“简单”道路,我实际上想了解什么在这里进行以及如何正确地做我想做的事情。运行 API 时我没有收到任何错误,并且迁移似乎也在运行,只是我定义的字段实际上没有显示在数据库中,这意味着前端将无法正确添加数据。

我想在这里发生的是在前端提供一个商店列表,当用户添加饮料时,他们将不得不从该商店列表中进行选择。添加的每种饮料只能有 1 个商店,因为不同商店的饮料价格会有所不同。所以从技术上讲,饮料桌上会有很多“重复”的饮料,但连接到不同的位置。


慕标5832272
浏览 102回答 1
1回答

HUWWW

第一点是因为您正在使用自定义主键,所以您不应该使用它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"。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go