【问题标题】:GO GORM .Related() construct not working with non-default primary key names.GO GORM .Related() 构造不适用于非默认主键名称。
【发布时间】:2016-04-06 05:25:19
【问题描述】:

使用“默认”主键命名约定时:

POSTGRES 表

CREATE TABLE person
(
    id SERIAL,
    name varchar(255) NOT NULL,
    CONSTRAINT person_pk PRIMARY KEY (id)
)


CREATE TABLE email
(
    id SERIAL,
    person_id int NOT NULL REFERENCES person(id),
    CONSTRAINT email_pk PRIMARY KEY (id)
)

根据示例,这个 .Related() 构造可以正常工作:

type Person struct {
    ID   int
    Name string
    Emails   []Email
}

type Email struct {
    ID       int
    PersonID int
}
person := models.Person{}
conn.DB.First(&person).Related(&person.Emails)

但是当使用非默认主键名称时,该示例不起作用。无论有多少封电子邮件,都只会添加一封电子邮件。

CREATE TABLE person
(
    person_id SERIAL,
    name varchar(255) NOT NULL,
    CONSTRAINT person_pk PRIMARY KEY (person_id)
)

CREATE TABLE email
(
    email_id SERIAL,
    person_id int NOT NULL REFERENCES person(person_id),
    CONSTRAINT email_pk PRIMARY KEY (email_id)
)


type Person struct {
    PersonId int `gorm:"primary_key"`
    Name     string
    Emails   []Email `gorm:"ForeignKey:PersonId"`
}

type Email struct {
    EmailId  int    `gorm:"primary_key"`
    PersonId int
}

person := models.Person{}
conn.DB.First(&person).Related(&person.Emails)

我不得不求助于使用这个结构:

person := models.Person{}
conn.DB.First(&person)
conn.DB.Where("person_id = ?", person.PersonId).Find(&person.Emails)

在这种情况下是否可以使 .Related() 工作?

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    发现问题。以下是更正后的结构:

    type Person struct {
        PersonId int `gorm:"primary_key"`
        Name     string
        Emails   []Email `gorm:"ForeignKey:PersonRefer"`
    }
    
    type Email struct {
        EmailId     int `gorm:"primary_key"`
        Person      Person
        PersonRefer int `gorm:"column:person_id"`
    }
    
    conn.DB.First(&person).Related(&person.Emails, "PersonRefer")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 2012-07-30
      • 2010-10-30
      • 2016-12-23
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多