MySQL RDB 与使用 AWS Appsync 的外键的可选关系
Optional relation on MySQL RDB with foreign keys using AWS Appsync
我已经设置了一个 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 字段并为其创建上下文项。
## 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 和名称的值为 null),它可以工作,但它会抱怨模式冲突。 None 将解析器写入 MySQL RDB 的指南涵盖了如何建立字段关系。我也试过从 amplify api add-graphql-datasource
自动生成 templates/schema 但它吐出一个没有考虑外键关系的简单模型。
谁能告诉我如何在这里正确设置解析器?
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
我已经设置了一个 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 字段并为其创建上下文项。
## 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 和名称的值为 null),它可以工作,但它会抱怨模式冲突。 None 将解析器写入 MySQL RDB 的指南涵盖了如何建立字段关系。我也试过从 amplify api add-graphql-datasource
自动生成 templates/schema 但它吐出一个没有考虑外键关系的简单模型。
谁能告诉我如何在这里正确设置解析器?
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