AWS AppSync RDS: $ util.rds.toJSONObject () Вложенные объекты

Я использую Amazon RDS с AppSync. Я создал преобразователь, который объединяет две таблицы, чтобы получить взаимно-однозначную связь между ними, и возвращает столбцы из обеих таблиц. Что я хотел бы сделать, так это иметь возможность вложить некоторые столбцы под ключ в полученный проанализированный объект JSON, оцениваемый с помощью $ util.rds.toJSONObject ().

Вот схема:

type Parent {
    col1: String
    col2: String
    child: Child
}

type Child {
    col3: String
    col4: String
}

Вот решатель:

{
    "version": "2018-05-29",
    "statements": [
        "SELECT parent.*, child.col3 AS `child.col3`, child.col4 AS `child.col4` FROM parent LEFT JOIN child ON parent.col1 = child.col3"
    ]
}

Я попытался назвать полученный столбец с помощью точечного синтаксиса, но $ util.rds.toJSONObject () не помещает col3 и col4 под ключ child. Причина в том, что в противном случае Apollo не сможет кэшировать и анализировать объект.

Примечание. Точечный синтаксис нигде не задокументирован. Обычно некоторые ORM используют технику точечного синтаксиса для преобразования строк SQL в соответствующие вложенные объекты JSON.


person Muhammad Talha Akbar    schedule 20.09.2019    source источник
comment
$util.rds.toJsonObject() Преобразует результат sql RDS в более удобный формат - объект JSON. Это не полноценный ORM. Вам нужно будет написать эту настраиваемую логику самостоятельно. Вы можете управлять выводом $util.rds.toJSONObject() как списком карт со строковыми ключами и значениями объекта. Кроме того, какой ожидаемый тип вывода прикреплен к этому преобразователю? (Это список родителей?)   -  person Aaron_H    schedule 30.10.2019
comment
Я обратился к резольверам AWS Lambda, которые использовали sequelize для запроса и возврата данных. Работает действительно хорошо. Я могу легко запрашивать отношения в JSON.   -  person Muhammad Talha Akbar    schedule 30.10.2019


Ответы (2)


Комментарий и ответ @Aaron_H были полезны для меня, но шаблон сопоставления ответов, представленный в ответе, для меня не сработал. Мне удалось получить рабочий шаблон сопоставления ответов для моего случая, который аналогичен рассматриваемому случаю. На изображениях ниже вы найдете информацию для запроса -> сообщение (id: ID) {...} (будет возвращено одно сообщение и связанный с ним пользователь):

  1. SQL-запрос к user таблице;
  2. SQL-запрос к message таблице;
  3. Запрос таблиц SQL JOIN для сообщения id = 1;
  4. Схема GraphQL;
  5. Шаблоны запросов и ответов;
  6. Запрос AWS AppSync.

введите здесь описание изображения  введите описание изображения здесь  введите описание изображения здесь  введите описание изображения здесь   введите здесь описание изображения  введите описание изображения здесь

https://github.com/xai1983kbu/apollo-server/blob/pulumi_appsync_2/bff_pulumi/graphql/resolvers/Query.message.js


Следующий пример для сообщений запроса

введите здесь описание изображения  введите описание изображения здесь  введите описание изображения здесь

https://github.com/xai1983kbu/apollo-server/blob/pulumi_appsync_2/bff_pulumi/graphql/resolvers/Query.messages.js

person SAndriy    schedule 02.04.2020

Предполагая, что ваш преобразователь ожидает вернуть список родительских типов, т.е. [Parent!]!, вы можете написать логику шаблона отображения ответов следующим образом:

#if($ctx.error)
    $util.error($ctx.error.message, $ctx.error.type)
#end

#set($output = $utils.rds.toJsonObject($ctx.result)[0])

## Make sure to handle instances where fields are null
## or don't exist according to your business logic

#foreach( $item in $output )
    #set($item.child = {
        "col3": $item.get("child.col3"),
        "col4": $item.get("child.col4")
    })
#end

$util.toJson($output)
person Aaron_H    schedule 30.10.2019