#json #postgresql #go #go-gorm
#json #postgresql #Вперед #go-gorm
Вопрос:
Я новичок в Go и нуждаюсь в некоторой помощи.
В моей базе данных PostgreSQL у меня есть 4 таблицы. Они вызывали: surveys
, questions
, options
и surveys_questions_options
.
Они выглядят следующим образом:
surveys
таблица:
| survey_id (uuid4) | survey_name (varchar) |
|--------------------------------------|-----------------------|
| 0cf1cf18-d5fd-474e-a8be-754fbdc89720 | April |
| b9fg55d9-n5fy-s7fe-s5bh-856fbdc89720 | May |
questions
таблица:
| question_id (int) | question_text (text) |
|-------------------|------------------------------|
| 1 | What is your favorite color? |
options
таблица:
| option_id (int) | option_text (text) |
|-------------------|--------------------|
| 1 | red |
| 2 | blue |
| 3 | grey |
| 4 | green |
| 5 | brown |
surveys_questions_options
таблица объединяет данные из всех трех предыдущих таблиц:
| survey_id | question_id | option_id |
|--------------------------------------|-------------|-----------|
| 0cf1cf18-d5fd-474e-a8be-754fbdc89720 | 1 | 1 |
| 0cf1cf18-d5fd-474e-a8be-754fbdc89720 | 1 | 2 |
| 0cf1cf18-d5fd-474e-a8be-754fbdc89720 | 1 | 3 |
| b9fg55d9-n5fy-s7fe-s5bh-856fbdc89720 | 1 | 3 |
| b9fg55d9-n5fy-s7fe-s5bh-856fbdc89720 | 1 | 4 |
| b9fg55d9-n5fy-s7fe-s5bh-856fbdc89720 | 1 | 5 |
Как я могу создать вложенный JSON-ответ в Go? Я использую библиотеку GORM. Я хочу ответ JSON, подобный этому:
[
{
"survey_id": "0cf1cf18-d5fd-474e-a8be-754fbdc89720",
"survey_name": "April",
"questions": [
{
"question_id": 1,
"question_text": "What is your favorite color?",
"options": [
{
"option_id": 1,
"option_text": "red"
},
{
"option_id": 2,
"option_text": "blue"
},
{
"option_id": 3,
"option_text": "grey"
},
]
}
]
},
{
"survey_id": "b9fg55d9-n5fy-s7fe-s5bh-856fbdc89720",
"survey_name": "May",
"questions": [
{
"question_id": 1,
"question_text": "What is your favorite color?",
"options": [
{
"option_id": 3,
"option_text": "grey"
},
{
"option_id": 4,
"option_text": "green"
},
{
"option_id": 5,
"option_text": "brown"
},
]
}
]
}
]
Мои модели выглядят следующим образом:
type Survey struct {
SurveyID string `gorm:"primary_key" json:"survey_id"`
SurveyName string `gorm:"not null" json:"survey_name"`
Questions []Question
}
type Question struct {
QuestionID int `gorm:"primary_key" json:"question_id"`
QuestionText string `gorm:"not null;unique" json:"question_text"`
Options []Option
}
type Option struct {
OptionID int `gorm:"primary_key" json:"option_id"`
OptionText string `gorm:"not null;unique" json:"option_text"`
}
Комментарии:
1. где ваша попытка решить проблему?
2. @Tinwor привет! Прежде всего, мне нужно правильное направление. Как вы думаете, правильны ли мои модели (структура)? Во-вторых, нужна ли мне структура для сохранения моей таблицы? Если мои модели верны, как я могу правильно использовать их в обработчике для создания nersed JSON-ответа. Нужен какой-нибудь пример, если это возможно.
3. Если вы настроите вложенную структуру, она выдаст вложенный JSON. В чем конкретно заключается ваш вопрос?
4. Добавление соответствующих тегов для
Questions
/Options
и последующая сортировкаSurvey
должны дать то, что вы хотите5. Привет, ребята! Хорошо, я исправляю свои модели (структуры). Что дальше?
Ответ №1:
Я не уверен насчет части GORM, но с JSON вам также нужно добавить теги struct к вложенным объектам:
type Survey struct {
...
Questions []Question `json:"questions"`
}
type Question struct {
...
Options []Option `json:"options"`
}
Комментарии:
1. Здравствуйте! Хорошо, но что будет дальше? Насколько я понимаю, мне нужно выполнить SQL-запрос к таблице
SURVEYS_QUESTIONS_OPTIONS
. Затем оберните результат путем маршалинга, верно? Действительно запутался.
Ответ №2:
Нам не хватает некоторой области видимости в вашем коде, и поэтому довольно сложно указать вам правильное направление. Вы спрашиваете о запросе GORM, который вы получаете []Survey
, или вы спрашиваете о маршалировании []Survey
? В любом случае, вам также следует добавить тег к вопросам, как ответил Сломек.
Комментарии:
1. Здравствуйте! Меня интересуют оба решения. Я не уверен, что это возможно сделать с помощью GORM-запроса, поэтому было бы неплохо использовать сортировку.
Ответ №3:
Однако попробуйте это: Для извлечения вложенных данных в отношении m2m
type Survey struct {
gorm.Model
SurveyID string `gorm:"primary_key" json:"survey_id"`
SurveyName string `gorm:"not null" json:"survey_name"`
Questions []*Question `gorm:"many2many:survey_questions;"`
}
surveys := []*model.Survey{}
db := dbSession.Where(amp;model.Survey{SurveyID: id}).Preload("Questions").Find(amp;surveys)