Как вернуть формат Geo JSON из базы данных, используя подзапросы GORM? - PullRequest
0 голосов
/ 29 апреля 2020

Я ищу, чтобы получить геометрические объекты из моей базы данных PostGIS. Я написал запрос, который могу использовать, чтобы вернуть отформатированный вывод Geo JSON, который мне нужен для отображения. Однако у меня возникают проблемы с их извлечением с использованием подзапроса в GORM.

Моя цель в том, чтобы задать этот вопрос, - выяснить, как именно я правильно структурирую свой подзапрос GORM, чтобы я мог получить нужные мне данные .

Фактический запрос PostgreSQL:

SELECT 
  jsonb_build_object(
    'type', 
    'FeatureCollection', 
    'features', 
    jsonb_agg(features.feature)
  ) 
FROM 
  (
    SELECT 
      jsonb_build_object(
        'type', 
        'Feature', 
        'geometry', 
        ST_AsGeoJSON(geom):: jsonb, 
        'properties', 
        to_jsonb(inputs) - 'id' - 'geom'
      ) AS feature 
    FROM 
      (
        SELECT 
          * 
        FROM 
          gis_data 
        LIMIT 
          1000
      ) inputs
  ) features

То, как я пытаюсь использовать его в своей программе, заключается в следующем, однако, похоже, что Работа. Мне пришлось добавить две скобки в мой последний запрос, потому что мой запрос выбрасывал две дополнительные закрывающие скобки. Вот мой код:

var gisData []*model.GISData

sub1 := db.Raw("SELECT * FROM gis_data LIMIT 1000) inputs) features").SubQuery()

sub2 := db.Raw("SELECT jsonb_build_object('type', 'Feature', 'geometry', ST_AsGeoJSON(geom):: jsonb, 'properties', to_jsonb(inputs) - 'id' - 'geom') AS feature FROM ?", sub1).SubQuery()

if err := db.Raw("((SELECT jsonb_build_object('type', 'FeatureCollection', 'features', jsonb_agg(features.feature)) FROM ?", sub2).Scan(&gisData).Error; err != nil {
        return err
}

А вот мой журнал на моей консоли:

[2020-04-25 00:19:28]  [60.73ms] 
((SELECT jsonb_build_object('type', 'FeatureCollection', 'features', jsonb_agg(features.feature)) FROM ( SELECT jsonb_build_object('type', 'Feature', 'geometry', ST_AsGeoJSON(geom):: jsonb, 'properties', to_jsonb(inputs) - 'id' - 'geom') AS feature FROM ( SELECT * FROM gis_data LIMIT 1000) inputs) features))
[1 rows affected or returned ]

Структурная модель выглядит так:

type UsersByID struct {
    ID      uint64      `gorm:"primary_key" json:"id"`
    Name    string      `json:"name"`
    Lat     string      `json:"lat"`
    Lon     string      `json:"lon"`
    Country string      `json:"country"`
    City    string      `json:"city"`
    Zip     string      `json:"zip"`
    Geom    string      `json:"geom"`
}

Когда я поднимаю результат не в формате Geo JSON, а в формате JSON для полей моих свойств. Все поля свойств не возвращают данных. Куда я иду не так?

...