使用RDB作为Amplify GraphQL API的数据源
这篇文章是“AWS Amplify Advent Calendar 2020”的第17天。
(祝负责第16天的Dyson生日快乐)
经过/ 经历
这次我将撰写一篇关于AWS Amplify的GraphQL API的文章。
在 Amplify中,您可以使用GraphQL API,但我认为大多数人将DynamoDB用作其后端数据源。
实际上,大家知道这个 GraphQL API 的数据源不仅可以是 DynamoDB,还可以指定为 Aurora Serverless 作为 RDB 吗?
扩展文档 > 命令行界面 > API(Graph QL) > 关系型数据库
就我这个在RDB上成长起来的人来说,我对此非常感兴趣。然而,在上述链接的示例中,只提到了对一个表进行Mutation的例子。(截止到2020年12月16日)
所以,本文的内容是确认是否可以实现在关系数据库中经常使用的基本功能,例如SQL约束和多表连接等。
做了调查
首先需要进行环境的建立。
在查看以上链接的同时,首先我搭建了环境。
作為手續,首先需要事先創建 Aurora Serverless 的 DB 集群,並創建要訪問的資料表。
如果使用 DynamoDB,只需创建 GraphQL schema,然后使用 Amplify CLI 执行 amplify push,即可自动创建数据表。但如果使用 RDB(Aurora Serverless),由于 Amplify CLI 不会创建数据表(截至2020年12月16日),因此需要手动创建。
这次我创建了一个与链接指南中相同名称的数据库集群和表。
- テーブル作成時に実行したSQL文
CREATE DATABASE MarketPlace;
USE MarketPlace;
CREATE TABLE Customers (
id int(11) NOT NULL PRIMARY KEY,
name varchar(50) NOT NULL,
phone varchar(50) NOT NULL,
email varchar(50) NOT NULL
);
CREATE TABLE Orders (
id int(11) NOT NULL PRIMARY KEY,
customerId int(11) NOT NULL,
orderDate datetime DEFAULT CURRENT_TIMESTAMP,
KEY `customerId` (`customerId`),
CONSTRAINT `customer_orders_ibfk_1` FOREIGN KEY (`customerId`) REFERENCES `Customers` (`id`)
);
在本地环境的个人电脑上,按照以下步骤执行时,前面提到的表已经创建好。
-
- 切换到工作目录
-
- 使用amplify init对Amplify CLI进行初始化(根据需要创建AWS CLI配置文件)
-
- 使用amplify add api添加Amplify的GraphQL API功能
-
- 使用amplify api add-graphql-datasource将之前创建的Aurora Serverless DB集群注册为数据源
- 使用amplify push在AWS上部署GraphQL API
注意:请参考链接中的指南获取详细的步骤。
等待部署完成。
被制造的东西 de
当amplify push完成后,GraphQL API将在AWS上部署,并在本地PC上创建以下类似的内容。
他还会为您创建在部署时执行的CloudFormation堆栈定义,以及使用DynamoDB时前端可以使用的GraphQL源代码的模板。(在这里我省略了一些内容)
使用 GraphQL API 向 Aurora Serverless 注册数据。
我们将使用创建的GraphQL API将数据插入到Customers表中。
SQL的约束条件和默认值的行为
SQL约束 – 主键约束
如果遇到PK约束问题,记录将不会被创建,而”data”部分将返回为空的行为。
SQL 约束 – 非空约束
据显示,在GraphQL的验证处理中出现了错误。与PK约束类似,数据部分返回为null,表明Mutation处理未完成。然而,需要注意的是,关于错误显示与否的行为可能存在差异。
SQL约束-外键约束
当查看 Aurora Serverless 时,发现 Orders 表中没有数据。
类似于主键约束(PK)一样,如果遇到外键约束(FK),则不会创建记录,并且返回的数据部分将为 null。
默认值
最后,我会确认一下默认值。
(不涉及其他SQL约束的调查对象。)
在这里执行的SQL约束和默认值的确认工作是异常的。
获取两个表的JOIN结果
让我们来考虑一下两个表JOIN的结果如何显示。
根据前述,通过Amplify CLI创建的GraphQL模式和解析器,可以看出,虽然存在涉及CRUD的操作针对一个表,但没有找到支持多表JOIN的操作。因此,如果需要自己手动JOIN GraphQL API的结果,则需要进行额外的适配,以通过GraphQL API获取JOIN的结果。
根据调查,似乎需要额外创建模式和解析器。
参考链接(英文)
这次我们省略了调查,但是下一次我想深入探讨这个问题,包括 VTL 的写作方式,请务必关注。
总结
-
- 按照文件的描述,确实可以通过 Amplify CLI 创建一个使用 RDB(Aurora Serverless)作为数据源的 GraphQL API。
可以确认能够满足 RDB 的功能,例如 SQL 约束和默认值的查询结果,但是在某些情况下,行为可能会有所不同,如错误消息的存在与否等。
虽然为了单个表的 CRUD 操作自动创建了 GraphQL Schema 和解析器,但是对于涉及多个表的 JOIN 结果等复杂查询,目前(截至2020年12月16日)尚未自动创建,因此可能需要自己编写相关部分。
请参阅
有前辈总结了这些知识。根据第3部分的总结,似乎使用了 Lambda 来解决问题。
https://fixel.co.jp/blog/amplify-appsync-auroraserverless/
這次經過調查所獲得的結論就是以上內容。那就暫告一段落吧,再見!