英文:
GORM [error] unsupported data type: &[], incorrect schema
问题
GORM v1.25.1,我正在尝试在Worker
、Poster
和Job
模型上运行DB.AutoMigrate()
,但遇到了[error] unsupported data type: &[]
的问题。Worker和Job结构体应该具有多对多关系
,而Poster和Job应该具有一对多关系
。Worker和experience、worker和preference都应该是一对多关系
。请帮忙解决。
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"`
...更多字段
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"`
...更多字段
PosterID uint `json:"posterID"`
}
英文:
GORM v1.25.1, I'm tryping to run DB.AutoMigrate()
on Worker
, Poster
and Job
models but running into [error] unsupported data type: &[]
. The Worker and Job struct should have a many-to-many relation
, while Poster and Job should have one-to-many
relation. Worker and experience, worker and preference both should be a one-to-many
relation. Please help.
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"`
}
答案1
得分: 1
我能够使用以下代码实现你所需的功能。
请注意,为了演示的目的,我简化了你的模型(结构体),只包含与关联相关的字段。如果我遗漏了值得一提的内容,请随时提问,我会更新我的回答。
首先让我分享代码,然后我会详细解释它。
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{})
}
由于你的问题涉及到many2many
和one2many
关系,我将把我的回答分为两部分。
many2many
关系
要实现这种关系,你需要在保存关联实体的切片旁边添加注释gorm:"many2many:workers_posters;joinForeignKey:workersId"
。受影响的字段包括:
Worker
结构体中的Posters
字段Poster
结构体中的Workers
字段
显然,你需要根据要设置的字段更改joinForeignKey
的值。
one2many
关系
这种关系更简单,因为你不需要指定在many2many
关联中要创建的连接表(例如上面创建的workers_posters
表)。在这里,你只需要进行以下两个更改:
- 在
Poster
结构体中添加Jobs []Job
字段 - 在
Job
结构体中添加PosterID uint
字段
通过这样做,如果你运行Automigrate
方法,你将在数据库中看到正确的表,并且所有外键都正确设置。
如果有任何问题,请告诉我,谢谢!
英文:
I was able to achieve what you need with the following code.
> Please note that, for the sake of the demo, I simplified your models (structs) by including only the relevant fields for the associations. If I omitted something worth mentioning, feel free to ask for it and I'll update my answer.
Let me first share the code, then I'll explain it in detail.
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{})
}
As your question involve both the many2many
and the one2many
relationship, I'm gonna divide my answer into two parts.
The many2many
relationship
To achieve this relationship, you've to add the annotation gorm:"many2many:workers_posters;joinForeignKey:workersId"
next to the slices that hold associated entities. The affected fields are:
Posters
field within theWorker
structWorkers
field within thePoster
struct
Obviously, you've to change the value for the joinForeignKey
depending on what field you're about to set.
The one2many
relationship
This relationship is even simpler as you don't have to specify the join table that has to be created in a many2many
association (e.g. the above created workers_posters
table). Here, you only have to do these two changes:
- Add the
Jobs []Job
field within thePoster
struct - Add the
PosterID uint
field within theJob
struct
Thanks to this, if you run the Automigrate
method, you'll see the right tables in the database with all of the foreign keys correctly set up.
Let me know, thanks!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论