postgres, go -gorm - невозможно предварительно загрузить данные - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь предварительно загрузить некоторые данные при запросе строки в моем postgresql с помощью gorm

. У меня есть следующие типы, определенные в go с ассоциацией belongs to:

type MyObject struct {
    ID            uint      `grom:"column:id" json:"id"`
    Name          string    `gorm:"column:name" json:"name"`
    OwnerID       uint      `gorm:"column:owner_id" json:"owner_id"`
    Owner         Owner     `json:"owner"`
    ...
}

type Owner struct {
    ID         uint            `gorm:"column:id" json:"id"`
    Name       string          `gorm:"column:name" json:"name"`
    Config     json.RawMessage `gorm:"column:config" sql:"type:json" json:"config"`
    Components []uint8         `gorm:"column:components;type:integer[]" json:"components"`
}

и таблицы в postgres db со следующей строкой

my_schema.my_object

id  | name      | owner_id  | ...
----|-----------|-----------|-----
0   | testobj   | 0         | ...


my_schema.owner

id  | name      | config    | components
----|-----------|-----------|-----------
0   | testowner | <jsonb>   | {0,1,2,3}

Я выполняю следующий запрос с помощью gorm:

object := &models.MyObject{}

result := ls.Table("my_schema.my_object").
    Preload("Owner").
    Where("id = ?", "0").
    First(object)    

, но в результате в object я получаю следующую структуру:

{"id": 0, "name": "testobj", "owner_id":0, "owner": {"id": 0, "name": "", "config": nil, "components": nil}}

Я не получаю никаких ошибок или предупреждений любого рода, отношение иностранного ключа было указано при создании базы данных sql script

1 Ответ

0 голосов
/ 08 апреля 2020

Я смог достичь того, что хотел, реализовав метод TableName() для каждой из моих моделей следующим образом:

type MyObject struct {
    ID            uint      `grom:"column:id" json:"id"`
    OwnerID       uint      `gorm:"column:owner_id" json:"owner_id"`
    Owner         Owner     `json:"owner"`
    ...
}

func (MyObject) TableName() {
    return "my_schema.my_object"
}

type Owner struct {
    ID         uint            `gorm:"column:id" json:"id"`
    ...
}

func (Owner) TableName() {
    return "my_schema.owner"
}

Затем я могу использовать его в запросе, подобном следующему:

myObject := &models.MyObject{}
result := ls.Model(myObject).
    Where("id = ?", id).  //assume any valid value for id
    First(myObject).
    Related(&myObject.Owner)

return myObject, processResult(result)

, в конце концов, при отправке запроса на MyObject на мой сервер я получаю все данные связанного объекта Owner в базе данных:

$ curl "http://localhost:8080/api/objetcs/related/1" | jq  // passing 1 as object id value in url params
{
  "id": "1", // taken from UrlParam
  "name": "testobj",
  "owner": {
    "id": "1", // using foreign key owner_id
    "name": "testowner",
    "config": configJson // json object taken from row in my_schema.owner table in the DB
    }
  }
}
...