首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GoLang中的go-pgsql访问postgresql数据的正确方法

使用GoLang中的go-pgsql访问postgresql数据的正确方法
EN

Stack Overflow用户
提问于 2022-02-26 19:55:33
回答 1查看 588关注 0票数 2

为了了解如何使用嵌套对象访问数据,我一直在阅读GoLang go-pgsql文档,但到目前为止我一直没有成功。

这里描述了我正在努力实现的目标:

我有两种型号的ClimateQuestionsSteps

代码语言:javascript
复制
type ClimateQuestions struct {
    tableName struct{} `pg:"climatequestions"`
    Id        int      `json:"id" pg:",pk"`
    Title     string   `json:"title"`
    Steps     []*Steps  `pg:"rel:has-many"`
}

type Steps struct {
    tableName        struct{}          `pg:"steps"`
    Id               int               `json:"id"`
    Label            string            `json:"label"`
    Number           int               `json:"number"`
    QuestionId       int               `json:"question_id"`
}

下面是如何在数据库中定义它们:

代码语言:javascript
复制
CREATE TABLE climatequestions (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL
);

CREATE TABLE steps (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    value DOUBLE PRECISION NOT NULL,
    question_id INT REFERENCES climatequestions(id)
);

这些模型之间的关系是这样的:对于每一个气候问题,都可以有很多步骤。我通过在ClimateQuestions结构中添加一个名为Stepsrel:has-many的字段来表示这一点。

现在,从数据库中,我想获得所有的气候问题,在每个问题中,我想要一组步骤数据。

我第一个做到这一点的方法是:

代码语言:javascript
复制
var climateQuestions []model.ClimateQuestions
err := db.Model(&climateQuestions).Select()

这部分起作用,因为它返回与气候问题相关的所有数据,但不添加嵌套步骤数据。以下是返回内容的JSON格式:

代码语言:javascript
复制
[{"id":1,"title":"first question?","Steps":null},{"id":2,"title":"second question?","Steps":null}]

对于我如何做到这一点,有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-27 00:20:31

  1. 因为您有自定义的联接外键,所以需要在pg:"rel:has-many,join_fk:question_id"中添加ClimateQuestions.Steps标记
  2. 在struct Steps中,您需要告诉pg它是哪个字段。
  3. 您忘了调用Relation函数

这是正确的结构

代码语言:javascript
复制
type ClimateQuestions struct {
    tableName struct{} `pg:"climatequestions"`
    Id        int      `json:"id" pg:",pk"`
    Title     string   `json:"title"`
    Steps     []*Steps `pg:"rel:has-many,join_fk:question_id"`
}

type Steps struct {
    tableName  struct{} `pg:"steps"`
    Id         int      `json:"id"`
    Label      string   `json:"label" pg:"title"`
    Number     int      `json:"number" pg:"value"`
    QuestionId int      `json:"question_id"`
}

这就是你应该如何执行db。

代码语言:javascript
复制
    var climateQuestions []ClimateQuestions
    err := db.Model(&climateQuestions).Relation("Steps").Select()
    if err != nil {
        panic(err.Error())
    }

    for _, v := range climateQuestions {
        fmt.Printf("%#v\n", v)
        for _, v1 := range v.Steps {
            fmt.Printf("%#v\n", v1)
        }
        fmt.Println("")
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71279864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档