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

Gorm 关系错误:需要为关系定义有效的外键,或者需要实现 Valuer/Scanner 接口

Gorm 关系错误:需要为关系定义有效的外键,或者需要实现 Valuer/Scanner 接口

Go
一只斗牛犬 2022-08-30 21:47:34
我正在对使用 Gorm 时出现的问题进行故障排除。我的sqlite3数据库和Go数据模型可以很好地工作,但是当我在构建环境中遇到一些依赖项问题时,我尝试从供应商文件夹中复制/删除一些包,然后“去获取”,直到我让构建工作...但是现在当我在自己的机器中编译和运行时,我遇到了以前从未有过的问题。当我尝试这样的事情时(已经检查了configID以确保它具有有效的条目):    var config models.ConfigurationDescription    // Find the Configuration    results := db.Where("id = ?", configID).        Preload("Location").        Find(&config)Gorm 抛出以下错误: "invalid field found for struct `models.ConfigurationDescription`'s field Location, need to define a valid foreign key for relations or it need to implement the Valuer/Scanner interface"这就是我定义数据模型的方式(在依赖关系混乱之前,数据模型工作得很好):package modelstype LocationDescription struct {    ID       int    `json:"locationID"`    Name     string `json:"name"`    IsActive bool   `json:"isActive"`}func (LocationDescription) TableName() string { return "locations" }type ConfigurationDescription struct {    ID         int                 `json:"configurationID"`    Name       string              `json:"name"`    IsActive   bool                `json:"isActive"`    LocationID int                 `json:"-"`    Location   LocationDescription `json:"location,omitempty" gorm:"foreignKey:ID;references:LocationID"`}func (ConfigurationDescription) TableName() string { return "configurations" }这是使用此设置针对 sqlite 数据库运行的:CREATE TABLE IF NOT EXISTS locations (    id           INTEGER PRIMARY KEY AUTOINCREMENT,    name         TEXT,    latitude     REAL CHECK (latitude > 0),    longitude    REAL CHECK (latitude > 0),    is_active    INTEGER DEFAULT 0);CREATE TABLE IF NOT EXISTS configurations (    id               INTEGER PRIMARY KEY AUTOINCREMENT,    location_id      INTEGER,    name             TEXT,    is_active        INTEGER DEFAULT 0,    CONSTRAINT location_fk FOREIGN KEY (location_id) REFERENCES locations(id) ON DELETE CASCADE);我知道它正在工作,我没有更改任何代码。我看到的一切看起来都像是按照文档到T,所以对依赖项的更新破坏了某些东西是没有意义的,因为它似乎没有任何重大更改.....所以问题是,有谁知道可能导致这种情况的原因吗?更重要的是,对如何解决问题有什么建议吗?
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

在我看来,您在位置描述字段中的标签是错误的。

首先,这是一种属于关系模式。

  • foreignKey应命名联接到外部实体的模型本地键字段。

  • references应命名外部实体的主键或唯一键。

尝试使用:

type ConfigurationDescription struct {

    ID         int                 `json:"configurationID"`

    Name       string              `json:"name"`

    IsActive   bool                `json:"isActive"`

    LocationID int                 `json:"-"`

    Location   LocationDescription `json:"location,omitempty" gorm:"foreignKey:LocationID;references:ID"`

}


查看完整回答
反对 回复 2022-08-30
  • 1 回答
  • 0 关注
  • 590 浏览
慕课专栏
更多

添加回答

举报

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