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

2023-12-12

我正在对使用 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 models

type 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
);

我知道这was工作,我没有更改任何代码。我看到的所有内容看起来都遵循文档,因此依赖项的更新破坏了某些内容是没有意义的,因为似乎没有发生任何重大更改...... ..

和!真正的亮点是它有效:

var location models.Location
DB.Where("is_active = ?", true).
        Preload("Configurations").
        Find(&location)

(这些结构和数据库实际上有更多的字段,但为了简单起见,我将它们修剪掉了)

type Location struct {
    ID             int             `json:"locationID"`
    Name           string          `json:"name"`
    Latitude       null.Float      `json:"latitude,omitempty"`
    Longitude      null.Float      `json:"longitude,omitempty"`
    IsActive       null.Bool       `json:"isActive" gorm:"default:false"`
    Configurations []Configuration `json:"configurations,omitempty" gorm:"foreignKey:LocationID;references:ID"`
}

type Configuration struct {
    ID             int             `json:"configurationID"`
    LocationID     int             `json:"locationID"`
    Name           string          `json:"name"`
    IsActive       null.Bool       `json:"isActive" gorm:"default:false"`
}

那么问题来了,有谁知道这可能是什么原因造成的吗?更重要的是,对于如何解决这个问题有什么建议吗?


在我看来,您的 LocationDescription 字段的标签方式错误。

首先,这是一个属于关系图案。

  • 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"`
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 展平嵌套结构会导致切片的切片

    所以我有一个像这样的结构 type Bus struct Number string Name string DirectStations Station Station is another struct ReverseStations
  • 鸭子在 Go 中打字

    我想写一个Join函数接受任意对象String 方法 package main import fmt strings type myint int func i myint String string return fmt Sprintf
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 匿名结构和空结构

    http play golang org p vhaKi5uVmm http play golang org p vhaKi5uVmm package main import fmt var battle make chan string
  • SQLite FTS4 使用特殊字符进行搜索

    我有一个 Android 应用程序 它使用 FTS4 虚拟表在 SQLite 数据库中搜索数据 它工作正常 但是当表中的数据包含特殊字符 如 或 时 SQLite MATCH 函数不会给出任何结果 我现在迷路了 谢谢 注意 默认的分词器真的
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • 使用 nw-gyp 构建 node-sqlite3

    我正在尝试为 node webkit 构建 sqlite3 The sqlite3 https www npmjs com package sqlite3 installing页面解释说它需要使用 nw gyp 来完成 据我了解 我应该下载
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • SQLite CreateDatabase 不支持错误

    我将 Entity Framework 4 2 CF 与 SQLite 一起使用 但是当我尝试启动该应用程序时 出现 提供商不支持 CreateDatabase 错误 这是我的模型映射 protected override void OnM
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • SQLiteException - 仅发生在某些设备上

    我最近向市场发布了一个应用程序 从开发者控制台来看 我的用户中大约有 1 2 遇到了这个问题 1 2 的比例很小 但人们更倾向于在某些内容不起作用时留下评论 而不是在它起作用时留下评论 这可能会对下载产生负面影响 不幸的是 开发人员控制台仅
  • 如何从 SQLite 获取记录总数

    我正在尝试从 Sqlite DB 获取行的总数 以下是我想要做的代码片段 我不知道我在这里做错了什么 public static int getTotalCount Context context Cursor c null try c g

随机推荐

  • 与 iPhone DropBox API 的简单同步

    我对 DropBox API 感到有点沮丧 它应该是简单明了的 但我还没有找到关于如何进行简单同步的简单明了的解释 我遵循了 DropBox API 附带的自述文件中可以找到的所有说明 为了测试整个过程 我创建了两个按钮来从我的 DropB
  • ECMAScript 6 负二进制文字

    通过 EMCAScript6 我发现有一种方法可以表示二进制文字使用0b or 0B字首 我正在尝试它 但找不到表示负数的方法 因为它没有使用补码 我错过了什么吗 我找不到实际规范中解释二进制文字的位置 我想我可以通过类似的操作自己实现它
  • 仅在应用程序发布到 Google Play 后,Firebase 数据库才会出现错误 - android

    我正在制作一个使用 firebase 数据库的应用程序 我的应用程序运行时没有崩溃 直到我将其作为测试版发布到 Google Play 上 当我发布该应用程序时 它不断崩溃并在一行上返回 com google firebase databa
  • 24 小时后过期的 SQL 条目

    我想制作一个表 其中的条目在插入 PHP 和 MySQL 后 24 小时后过期 理想情况下 我希望每次用户与我的服务器交互时运行 删除过程 以删除旧条目 由于这种情况更为频繁 因此您应该不会有大量数据需要删除 因此它应该只需要几毫秒 我为每
  • 如何使用实体框架从 SQL Server 实例获取数据库名称列表?

    我想使用实体框架 EF 查询 SQL Server 实例并返回该实例上的数据库名称列表 我可以使用以下代码来做到这一点 但想知道是否有 EF 的方法 public static string GetDatabaseNames SqlConn
  • linq toEntity 无法识别方法

    我有这些方法 public int count Guid companyId Expression
  • 空手道 API 测试中不存在 iRequired 请求部分“文件”

    当我尝试使用以下功能时 我收到必需的请求部分 文件 不存在 功能 验证 API 是否正确返回产品 Background url http localhost 8080 Scenario Products are returned on po
  • 使用元标记和 PHP 重定向页面

    在这里 在 PHP 代码中 我面临着在有效登录后重定向页面的问题 示例代码 result mysql query sql count mysql num rows result if count 1 echo else gt gt
  • 如何在没有 ResultSet 的情况下获得 ResultSetMetaData 的等效项

    我需要将一堆列名解析为列索引 以便使用一些不错的ResultSetMetaData方法 然而 我知道如何获得的唯一方法ResultSetMetaData对象是通过调用getMetaData 一些ResultSet 我遇到的问题是 获取 Re
  • Spring 批量暂停/恢复与停止/重新启动

    我是 Spring Batch 的新手 有一些关于暂停 恢复的问题 阅读 spring Batch 文档后 似乎没有任何内置的暂停或恢复功能 但是 我从主站点找到了这个用例 http docs spring io spring batch
  • 如何一条一条选择记录而不重复

    select id name from customer order by random limit 5 上述查询选择随机记录 但是它会重复行 我只想每次选择一行而不重复 假设我的 id 为 1 到 5 第一次我想选择 1 第二次查询显示
  • 使用 Azure Active Directory Oauth 进行 Azure 服务管理 API 身份验证

    我想通过curl 使用Azure AD 对Azure 服务管理API 进行身份验证 I 设置一个应用程序在我的默认目录中 在这个免费试用订阅中 这是我拥有的唯一目录 当我定位 oauth 令牌端点时 我收到一个 JWT curl data
  • 关于验证用户登录名和密码的问题

    朋友们 我需要制作一个软件 需要验证有效的用户登录才能使用软件 我试过这个 bool valid false using PrincipalContext context new PrincipalContext ContextType D
  • Docker compose在另一个目录会影响其他容器

    我有一个问题 我用我的docker compose一个项目的文件 然后我将其复制到另一个目录以运行另一个容器 但每当我这样做时 它都会重新创建现有容器 或者如果我使用 down 命令 它还会销毁另一个目录中的容器 可能会出现什么问题 这是我
  • 如何将工作日和时间对象解析为从今天开始的下一个逻辑日期?

    我的字符串中有一个日期 看起来像MON 07 15 我试图将其解析为Date使用这段代码 System out println new SimpleDateFormat E kk mm parse MON 07 15 使用上面的代码 打印一
  • requiredFieldValidator 在更新面板中工作异常

    我有一个带有文本框 必填字段验证器和几个按钮的更新面板 页面加载时 您会看到一个标签和一个按钮 按下按钮时 将显示文本框和验证器 以及其他按钮 显示的基本变化效果很好 但是 即使文本框已填充 我的验证器 设置为动态 也会显示其错误消息 假设
  • 强制 iOS 从 HTML5 Canvas 下载图像(使用纯 JavaScript)

    这个问题之前已经被问过 普遍的回答是在 iOS 上无法完成 However这些问题已经存在了好几年了 有可能已经制定了解决方法 或者现在有办法做到这一点 我有一个可用的纯 JavaScript 图像编辑器 它不会让最后的编辑步骤 保存编辑后
  • 动态高度浏览器

    我正在尝试在自定义滚动视图中创建一个自定义视图分页器 动态包裹当前孩子的高度 package com example vihaan dynamicviewpager import android content Context import
  • Python win32com 和二维数组

    当使用 python 和 win32com 来自动化 Adob e 软件时 会遇到传递 2d 坐标数组的问题 如果看一下 Adob e 为 Visual Basic VB 提供的代码 就会发现很简单 在 Illustrator 中绘制线条的
  • Gorm 关系错误:需要为关系定义有效的外键或者需要实现 Valuer/Scanner 接口

    我正在对使用 Gorm 时出现的问题进行故障排除 我的 sqlite3 数据库和 Go 数据模型一切都工作得很好 但是当我遇到一些依赖项问题时 无法在构建环境中 进入 所以我尝试从供应商文件夹中复制 删除一些包 然后重新 去 直到我让构建工