Home > Article > Backend Development > GORM unsupported data types: &, incorrect schema
According to the introduction of php editor Banana, GORM is a popular Go language ORM library, which provides convenient database operation methods. However, GORM does not support all data types, and incorrect schemas may occur when handling certain data types. This means that when using GORM, developers need to pay attention to using supported data types and ensure that the data schema is correct to avoid potential problems. Although GORM is powerful, these limitations require developers to handle it with caution when using it.
gorm v1.25.1, I tried running on worker
, poster
and job
modelsdb.automigrate()
, but encountered [error] Unsupported data type: &[]
. The worker and job structures should have a many-to-many relationship
, while the poster and job should have a one-to-many
relationship. Workers and experiences, workers and preferences should all be one-to-many
relationships. 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"` }
I was able to achieve what you need with the following code.
Please note that for the sake of demonstration, I have simplified your model (structure) by including only the relevant fields of the association. If I've missed something worth mentioning, feel free to ask and I'll update my answer.
I will share the code first and then 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{}) }
Since your question involves both many2many
and one2many
relationships, I will split my answer into two parts.
many2many
RelationshipTo implement this relationship, you must add the annotation gorm:"many2many:workers_posters;joinforeignkey:workersid"
next to the slice that holds the associated entity. The affected fields are:
posters
worker
field in the structureworkers
poster
field in the structureObviously you have to change the value of joinforeignkey
depending on the field you want to set.
one2many
Relationship This relationship is even simpler because you don't have to specify the join table that must be created in the many2many
association (such as the workers_posters
table created above). Here you only need to make these two changes:
jobs []job
field in the
posterposterid uint
field in the job
structureSo if you run the automigrate
method you will see the correct table in the database and all foreign keys set up correctly.
Please tell me, thank you!
The above is the detailed content of GORM unsupported data types: &, incorrect schema. For more information, please follow other related articles on the PHP Chinese website!