【问题标题】:Optional relation on MySQL RDB with foreign keys using AWS AppsyncMySQL RDB 上的可选关系与使用 AWS Appsync 的外键
【发布时间】:2020-05-25 11:02:46
【问题描述】:

我设置了一个 Aurora Serverless RDB,其中包含几个带有外键的表。我有一些基本的 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 转义以使其更具可读性。如果我在所有这些对象上设置“上下文”对象(id 和名称为空值),它可以工作,但它会抱怨架构违规。将解析器写入 MySQL RDB 的指南都没有涉及如何处理字段关系。我还尝试从amplify api add-graphql-datasource 自动生成模板/模式,但它给出了一个没有考虑外键关系的简单模型。

谁能告诉我如何在这里正确设置解析器?

【问题讨论】:

  • 我很好奇unable to convert下面的错误{...你想检查你的映射模板中没有留下杂散的花括号吗?

标签: mysql aws-appsync vtl


【解决方案1】:

VTL 中 if 语句后面的{ 需要去掉。你的映射模板的那部分应该看起来像

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

VTL 中 if 语句的签名如下:

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

如需 VTL 参考,请查看https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html#conditional-checks

【讨论】:

  • 啊,我太习惯于编译语言告诉你错误的语法。谢谢,解决了。
猜你喜欢
  • 2018-09-06
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2018-12-21
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多