登录
首页 >  Golang >  Go问答

预加载数据时,postgres和go-gorm遇到困难

来源:stackoverflow

时间:2024-03-07 13:06:26 462浏览 收藏

哈喽!今天心血来潮给大家带来了《预加载数据时,postgres和go-gorm遇到困难》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

在使用 gorm 查询 postgresql 上的行时,我尝试预加载一些数据

我在 go 中定义了以下类型,并与 属于 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 数据库中的表,其中一行如下

my_schema.my_object

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


my_schema.owner

id  | name      | config    | components
----|-----------|-----------|-----------
0   | testowner |    | {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脚本中指定了外键关系


解决方案


通过为每个模型实现 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
    }
  }
}

本篇关于《预加载数据时,postgres和go-gorm遇到困难》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>