Heim >Backend-Entwicklung >Golang >GORM nicht unterstützte Datentypen: &, falsches Schema

GORM nicht unterstützte Datentypen: &, falsches Schema

WBOY
WBOYnach vorne
2024-02-12 21:18:09469Durchsuche

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

Gemäß der Einführung des PHP-Editors Banana ist GORM eine beliebte ORM-Bibliothek in der Go-Sprache, die praktische Methoden für den Datenbankbetrieb bietet. Allerdings unterstützt GORM nicht alle Datentypen und bei der Verarbeitung bestimmter Datentypen können falsche Schemata auftreten. Dies bedeutet, dass Entwickler bei der Verwendung von GORM darauf achten müssen, unterstützte Datentypen zu verwenden und sicherzustellen, dass das Datenschema korrekt ist, um potenzielle Probleme zu vermeiden. Obwohl GORM leistungsstark ist, erfordern diese Einschränkungen von Entwicklern, bei der Verwendung vorsichtig damit umzugehen.

Frageninhalt

gorm v1.25.1, ich versuche es in workerposterjob 模型上运行 db.automigrate(),但遇到 [错误] 不支持的数据类型:&[]。 worker 和 job 结构应该具有 many-to-many 关系 ,而 poster 和 job 应该具有 one-to-many 关系。工人和经验、工人和偏好都应该是 one-to-many Beziehung. Bitte helfen Sie.

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

Workaround

Ich konnte mit dem folgenden Code erreichen, was Sie brauchen.

Bitte beachten Sie, dass ich zu Demonstrationszwecken Ihr Modell (Struktur) vereinfacht habe, indem ich nur die relevanten Felder der Assoziation einbeziehe. Wenn ich etwas Erwähnenswertes übersehen habe, fragen Sie einfach nach und ich werde meine Antwort aktualisieren.

Ich werde zuerst den Code teilen und ihn dann im Detail erklären.

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

Da Ihre Frage beide many2manyone2many Zusammenhänge betrifft, teile ich meine Antwort in zwei Teile.

many2many Beziehung

Um diese Beziehung zu implementieren, müssen Sie eine Anmerkung gorm:"many2many:workers_posters;joinforeignkey:workersid" neben dem Slice hinzufügen, der die zugehörige Entität enthält. Betroffene Felder sind:

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

Natürlich müssen Sie den Wert von joinforeignkey abhängig vom Feld ändern, das Sie festlegen möchten.

one2many Beziehung

Diese Beziehung ist sogar noch einfacher, da Sie keine Join-Tabelle angeben müssen, die in der many2many 关联中创建的联接表(例如上面创建的 workers_posters-Zuordnung erstellt werden muss (wie die oben erstellte workers_posters-Tabelle). Hier müssen Sie nur diese beiden Änderungen vornehmen:

  1. Im poster 结构中添加 jobs []jobFeld
  2. Im job 结构中添加 posterid uintFeld

Wenn Sie also die automigrate-Methode ausführen, sehen Sie die richtige Tabelle in der Datenbank und alle Fremdschlüssel sind korrekt eingestellt.

Bitte sag es mir, danke!

Das obige ist der detaillierte Inhalt vonGORM nicht unterstützte Datentypen: &, falsches Schema. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen