文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

GORM 不支持的数据类型:&、不正确的架构

2024-02-12 20:46

关注

根据php小编香蕉的介绍,GORM是一款流行的Go语言ORM库,它提供了便捷的数据库操作方式。然而,GORM并不支持所有的数据类型,并且在处理某些数据类型时可能会出现错误的架构。这意味着在使用GORM时,开发者需要注意使用支持的数据类型,并确保数据架构正确,以避免潜在的问题。虽然GORM功能强大,但这些限制需要开发者在使用时谨慎处理。

问题内容

gorm v1.25.1,我尝试在 workerposterjob 模型上运行 db.automigrate(),但遇到 [错误] 不支持的数据类型:&[]。 worker 和 job 结构应该具有 many-to-many 关系 ,而 poster 和 job 应该具有 one-to-many 关系。工人和经验、工人和偏好都应该是 one-to-many 关系。请帮忙。

package model

type experience struct {
    gorm.Model
    Company  int    `json:"company"`
    JobTitle string `json:"jobTitle"`
    WorkerID uint
}

type preference struct {
    gorm.Model
    JobTitle string `json:"JobTitle"`
    MinPay   int    `json:"minPay"`
    MaxPay   int    `json:"maxPay"`
    WorkerID uint
}

type Worker struct {
    gorm.Model
    Username     string       `gorm:"uniqueIndex;not null" json:"username"`
        ...more fields
    Experience   []experience `json:"experience"`
    Preference   []preference `json:"preference"`
    AppliedJobs  []Job        `gorm:"many2many:worker_jobs;" json:"appliedJobs"`
}

type Poster struct {
    gorm.Model
    Name       string `gorm:"uniqueIndex;not null" json:"name"`
    Email      string `gorm:"uniqueIndex;not null" json:"email"`
    Phone      string `json:"phone"`
    JobsPosted []Job  `json:"jobsPosted"`
}

type Job struct {
    gorm.Model
    Title       string   `gorm:"uniqueIndex;not null" json:"title"`
        ...more fields
    PosterID uint `json:"posterID"`
}

解决方法

我能够通过以下代码实现您所需要的。

请注意,为了演示,我通过仅包含关联的相关字段来简化您的模型(结构)。如果我遗漏了一些值得一提的内容,请随时询问,我会更新我的答案。

我先分享一下代码,然后再详细解释。

package main

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type Worker struct {
    gorm.Model
    Username string `gorm:"uniqueIndex;not null" json:"username"`

    Posters []Poster `gorm:"many2many:workers_posters;joinForeignKey:postersId"`
}

type Poster struct {
    gorm.Model
    Name  string `gorm:"uniqueIndex;not null" json:"name"`
    Email string `gorm:"uniqueIndex;not null" json:"email"`
    Phone string `json:"phone"`

    Workers []Worker `gorm:"many2many:workers_posters;joinForeignKey:workersId"`
    Jobs    []Job
}

type Job struct {
    gorm.Model
    Title    string `gorm:"uniqueIndex;not null" json:"title"`
    PosterID uint   `json:"posterID"`
}

func main() {
    dsn := "host=localhost port=54322 user=postgres password=postgres dbname=postgres sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn))
    if err != nil {
        panic(err)
    }

    db.AutoMigrate(&Worker{}, &Poster{}, &Job{})
}

由于您的问题同时涉及 many2manyone2many 关系,因此我将把我的答案分为两部分。

many2many 关系

要实现这种关系,您必须在保存关联实体的切片旁边添加注释 gorm:"many2many:workers_posters;joinforeignkey:workersid"。受影响的字段是:

显然,您必须根据要设置的字段更改 joinforeignkey 的值。

one2many 关系

这种关系甚至更简单,因为您不必指定必须在 many2many 关联中创建的联接表(例如上面创建的 workers_posters 表)。在这里,您只需要做这两个更改:

  1. poster 结构中添加 jobs []job 字段
  2. job 结构中添加 posterid uint 字段

因此,如果您运行 automigrate 方法,您将在数据库中看到正确的表,并且所有外键都已正确设置。

请告诉我,谢谢!

以上就是GORM 不支持的数据类型:&、不正确的架构的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯