如何为 RDS 数据源编写 AWS AppSync 响应映射模板
How to write a AWS AppSync response mapping template for an RDS data source
我一直在关注此 guide 通过 AppSync 模式查询 Aurora Serverless 数据库。现在我想 运行 同时进行几个查询,请求映射如下:
{
"version": "2018-05-29",
"statements": [
"SELECT * FROM MyTable WHERE category='$ctx.args.category'",
"SELECT COUNT(*) FROM MyTable WHERE category='$ctx.args.category'",
]
}
那么,如何处理响应映射中的多选呢?该页面有几个示例,但 none 有两个选择:
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0]) ## For first item results
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0][0]) ## For first item of first query
$utils.toJson($utils.rds.toJsonObject($ctx.result)[1][0]) ## For first item of second query
$utils.toJson($utils.rds.toJsonObject($ctx.result)??????) ## ?? For first & second item results
我预测的响应类型如下,但不严格,只要我能得到值。
type MyResponse {
MyResponseItemList [MyResponseItem]
Count Int
}
type MyResponseItem {
Id: ID!
Name: String
...
}
进行两次选择将不适用于 AppSync。
我建议您要么将两个 SQL 查询拆分为两个不同的 GraphQL 查询操作,要么将两个 SQL 查询合并为一个。
FWIW,我刚开始使用 UNION ALL Appsync/RDS 带有两个 SELECT 的请求解析器查询:
{
"version": "2018-05-29",
"statements": ["SELECT patientIDa, patientIDb, distance FROM Distances WHERE patientIDa='$ctx.args.patientID' UNION ALL SELECT patientIDb, patientIDa, distance FROM Distances WHERE patientIDb='$ctx.args.patientID'"]
}
不确定这是否对 OP 有帮助,但可能会。
***注意:在我的例子中(可能是因为我在 windows 上)整个 ["SELECT...]
语句需要在一行上(没有 cr/lf)否则"non-escaped character..." 的 graphql 错误(使用 GraphiQL 测试)
我遇到了同样的问题,并且按如下方式运行。
我没有将 Count 作为直接的 Int 类型结果,而是将其转换为另一种类型,称为 PaginationResult。
type MyResponse {
MyResponseItemList [MyResponseItem]
Count PaginationResult
}
type PaginationResult {
Count Int
}
type MyResponseItem {
...
}
响应速度模板
#set($resMap = {
"MyResponseItemList": $utils.rds.toJsonObject($ctx.result)[0],
"Count": $utils.rds.toJsonObject($ctx.result)[1][0]
})
$util.toJson($resMap)
我一直在关注此 guide 通过 AppSync 模式查询 Aurora Serverless 数据库。现在我想 运行 同时进行几个查询,请求映射如下:
{
"version": "2018-05-29",
"statements": [
"SELECT * FROM MyTable WHERE category='$ctx.args.category'",
"SELECT COUNT(*) FROM MyTable WHERE category='$ctx.args.category'",
]
}
那么,如何处理响应映射中的多选呢?该页面有几个示例,但 none 有两个选择:
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0]) ## For first item results
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0][0]) ## For first item of first query
$utils.toJson($utils.rds.toJsonObject($ctx.result)[1][0]) ## For first item of second query
$utils.toJson($utils.rds.toJsonObject($ctx.result)??????) ## ?? For first & second item results
我预测的响应类型如下,但不严格,只要我能得到值。
type MyResponse {
MyResponseItemList [MyResponseItem]
Count Int
}
type MyResponseItem {
Id: ID!
Name: String
...
}
进行两次选择将不适用于 AppSync。
我建议您要么将两个 SQL 查询拆分为两个不同的 GraphQL 查询操作,要么将两个 SQL 查询合并为一个。
FWIW,我刚开始使用 UNION ALL Appsync/RDS 带有两个 SELECT 的请求解析器查询:
{
"version": "2018-05-29",
"statements": ["SELECT patientIDa, patientIDb, distance FROM Distances WHERE patientIDa='$ctx.args.patientID' UNION ALL SELECT patientIDb, patientIDa, distance FROM Distances WHERE patientIDb='$ctx.args.patientID'"]
}
不确定这是否对 OP 有帮助,但可能会。
***注意:在我的例子中(可能是因为我在 windows 上)整个 ["SELECT...]
语句需要在一行上(没有 cr/lf)否则"non-escaped character..." 的 graphql 错误(使用 GraphiQL 测试)
我遇到了同样的问题,并且按如下方式运行。
我没有将 Count 作为直接的 Int 类型结果,而是将其转换为另一种类型,称为 PaginationResult。
type MyResponse {
MyResponseItemList [MyResponseItem]
Count PaginationResult
}
type PaginationResult {
Count Int
}
type MyResponseItem {
...
}
响应速度模板
#set($resMap = {
"MyResponseItemList": $utils.rds.toJsonObject($ctx.result)[0],
"Count": $utils.rds.toJsonObject($ctx.result)[1][0]
})
$util.toJson($resMap)