Необязательное отношение на MySQL RDB с внешними ключами с использованием AWS Appsync - PullRequest
0 голосов
/ 10 февраля 2020

У меня установлена ​​Aurora Serverless RDB с парой таблиц с внешним ключом. У меня есть некоторые базовые c средства распознавания VTL, работающие над переводом запросов GraphQL к SQL, но у меня возникают проблемы, когда один из объектов, на которые есть ссылки, отображается только для некоторых элементов.

Это моя (упрощенная) схема:

type TodoItem {
    id: ID!
    title: String!
    done: Boolean!
    context: TaskContext
}

type TaskContext {
    id: ID!
    name: String!
}

input CreateTodoItemInput {
    title: String!
    done: Boolean!
    contextId: ID
}

input CreateContextInput {
    name: String!
}

type Mutation {
    createTodoItem(input: CreateTodoItemInput!): TodoItem
    createContext(input: CreateContextInput!): TaskContext
}

type Query {
    listTodoItems: [TodoItem!]!
}

Таким образом, с задачей связан дополнительный контекст. Для listTodoItems это мой шаблон запроса распознавателя:

{
    "version": "2018-05-29",
    "statements": [
        "SELECT i.id, i.title, i.done, c.id contextId, c.name contextName FROM todo_items i LEFT JOIN contexts c ON i.contextId = c.id"
    ]
}

И это мой ответ. Я просматриваю поля contextName и contextId и создаю для него элемент Context.

## Raise a GraphQL field error in case of a datasource invocation error
#if($ctx.error)
    $utils.error($ctx.error.message, $ctx.error.type)
#end

#set($rdsResult = $utils.rds.toJsonObject($ctx.result)[0])
#foreach($rdsResultItem in $rdsResult)
  #if($rdsResultItem.contextId) {
    #set($rdsResultItem.context = {
      "id": $rdsResultItem.contextId,
      "name": $rdsResultItem.contextName
    })
  #end
#end

$utils.toJson($rdsResult)

Но когда я запускаю запрос, я получаю такой результат:

Unable to convert 
   {

[
    {
        "contextName": "Work",
        "contextId": "6daa656b-5007-49e2-a584-d1399c5e7479",
        "id": "11879932-a51a-49d2-b9aa-672b8b30871a",
        "title": "Sample item 3",
        "done": false,
        "context": {
            "id": "6daa656b-5007-49e2-a584-d1399c5e7479",
            "name": "Work"
        }
    }, {
        "id": "021531f0-1846-49a7-8f11-67d5e56d7d99",
        "title": "Sample item",
        "done": true
    }, {
        "id": "864387dd-1e3b-49f2-8cdc-1ea8e3d8b901",
        "title": "Sample item",
        "done": false
    }
]

to class java.lang.Object.

Я очистил некоторые JSON, чтобы сделать его более читабельным. Если я установлю объект «context» на всех из них (с нулевыми значениями для id и name), он будет работать, но будет жаловаться на нарушение схемы. Ни одно из руководств по записи резолверов в MySQL RDB не охватывало, как выполнять полевые отношения. Я также попытался автоматически сгенерировать шаблоны / схему из amplify api add-graphql-datasource, но она выдает упрощенную c модель, которая не учитывает отношение внешнего ключа.

Может кто-нибудь сказать мне, как настроить здесь правильно?

1 Ответ

1 голос
/ 10 февраля 2020

Вам необходимо удалить { после оператора if в VTL. Этот сегмент шаблона сопоставления должен выглядеть следующим образом:

#foreach($rdsResultItem in $rdsResult)
  #if($rdsResultItem.contextId)
    #set($rdsResultItem.context = {
      "id": $rdsResultItem.contextId,
      "name": $rdsResultItem.contextName
    })
  #end
#end

Подпись оператора if в VTL выглядит следующим образом:

#if( $condition )
  Conditionally-evaluated lines
#end

Для получения ссылки на VTL см. https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html#conditional -Проверяет

...