Home  >  Article  >  Backend Development  >  GORM unsupported data types: &, incorrect schema

GORM unsupported data types: &, incorrect schema

WBOY
WBOYforward
2024-02-12 21:18:09369browse

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

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.

Question content

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"`
}

Solution

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 Relationship

To 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 structure
  • workers poster field in the structure

Obviously 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:

  1. Add jobs []job field in the poster
  2. structure
  3. Add the posterid uint field in the job structure

So 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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete