Maison >développement back-end >Golang >Types de données GORM non pris en charge : &, schéma incorrect

Types de données GORM non pris en charge : &, schéma incorrect

WBOY
WBOYavant
2024-02-12 21:18:09467parcourir

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

Selon l'introduction de l'éditeur PHP Banana, GORM est une bibliothèque ORM en langage Go populaire, qui fournit des méthodes pratiques de fonctionnement de base de données. Cependant, GORM ne prend pas en charge tous les types de données et des schémas incorrects peuvent survenir lors de la gestion de certains types de données. Cela signifie que lors de l'utilisation de GORM, les développeurs doivent faire attention à l'utilisation des types de données pris en charge et s'assurer que le schéma de données est correct pour éviter des problèmes potentiels. Bien que GORM soit puissant, ces limitations obligent les développeurs à le manipuler avec prudence lors de son utilisation.

Contenu de la question

gorm v1.25.1, j'essaye en workerposterjob 模型上运行 db.automigrate(),但遇到 [错误] 不支持的数据类型:&[]。 worker 和 job 结构应该具有 many-to-many 关系 ,而 poster 和 job 应该具有 one-to-many 关系。工人和经验、工人和偏好都应该是 one-to-many relation. s'il vous plaît, aidez-moi.

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 de contournement

J'ai pu obtenir ce dont vous avez besoin avec le code suivant.

Veuillez noter que par souci de démonstration, j'ai simplifié votre modèle (structure) en incluant uniquement les champs pertinents de l'association. Si j'ai raté quelque chose qui mérite d'être mentionné, n'hésitez pas à demander et je mettrai à jour ma réponse.

Je partagerai d'abord le code, puis je l'expliquerai en détail.

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{})
}

Puisque votre question touche aux deux many2manyone2many relations, je diviserai ma réponse en deux parties.

many2many Relation

Pour mettre en œuvre cette relation, vous devez ajouter une annotation gorm:"many2many:workers_posters;joinforeignkey:workersid" à côté de la tranche qui contient l'entité associée. Les champs concernés sont :

  • posters 结构体中的 worker Terrain
  • workers 结构体中的 poster Terrain

Vous devez évidemment modifier la valeur de joinforeignkey en fonction du champ que vous souhaitez définir.

one2many Relation

Cette relation est encore plus simple car vous n'avez pas besoin de spécifier une table de jointure (telle que la table workers_posters créée ci-dessus) qui doit être créée dans l'association many2many 关联中创建的联接表(例如上面创建的 workers_posters. Ici, il vous suffit d'effectuer ces deux modifications :

  1. Dans le poster 结构中添加 jobs []jobterrain
  2. Dans le job 结构中添加 posterid uintterrain

Donc, si vous exécutez la méthode automigrate, vous verrez la table correcte dans la base de données et toutes les clés étrangères définies correctement.

S'il vous plaît, dites-moi, merci !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer