从Amazon DynamoDB 导入(可选) - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从Amazon DynamoDB 导入(可选)

Amazon AppSync 可以自动创建 GraphQL 架构并将解析器连接到现有的 Amazon DynamoDB 表。如果您有想要通过 GraphQL 端点公开数据的 DynamoDB 表,或者如果您更愿意先从数据库设计开始,而不是 GraphQL 架构,这可能会很有用。

导入 DynamoDB 表

使用Amazon AppSync控制台导入您的 DynamoDB

  1. 登录 Amazon Web Services Management Console并打开 AppSync 控制台

    1. API 控制面板中,选择你的 GraphQL API。

    2. 边栏中,选择 “数据源”。

  2. 在导航窗格中,选择 “数据源”,然后选择 “创建数据源”。

    1. Data 源名称中,为数据源输入一个名称。

    2. 对于数据源类型,选择 Amazon DynamoDB 表

    3. 对于 “区域”,选择相应的区域。

    4. 对于表名,从下拉列表中选择 Amazon DynamoDB 表。

    5. 选择 “自动生成 GraphQL”。

    6. 以下两个代码编辑器显示 GraphQL 架构:

      • 顶级编辑器-您可以使用此编辑器为您的类型指定一个自定义名称(例如type MYNAME {...}),该名称将包含运行查询或突变时来自 DynamoDB 表的数据。您也可以向类型添加字段,例如 DynamoDB 非关键属性(导入时无法检测到这些属性)。

      • 底部编辑器 – 使用此只读编辑器可以查看生成的 GraphQL 架构片段。它显示会将哪些类型、查询和更改合并到您的架构中。如果您在顶部编辑器中编辑类型,底部编辑器中的内容会相应发生变化。

  3. 选择 “创建” 按钮。

    您的架构会被合并,并创建解析程序。完成此操作后,您可以按照 “使用您的 API” 中所述运行变更和查询。

    注意

    为所创建架构的参数创建 GraphQLinput 类型。例如,如果您导入名为的表Books,则可能存在如下所示的输入类型:

    input CreateBooksInput { ISBN: String! Author: String Title: String Price: String }

    要在 GraphQL 查询或更改中使用此类型,执行以下操作:

    mutation add { createBooks(input:{ ISBN:2349238 Author:"Nadia Bailey" Title:"Running in the park" Price:"10" }){ ISBN Author } }

添加无法通过架构导入定义的属性

假设您有一个格式为 DynamoDB 表:

{ Table: { AttributeDefinitions: [ { AttributeName: 'authorId', AttributeType: 'S' }, { AttributeName: 'bookId', AttributeType: 'S' }, { AttributeName: 'title', AttributeType: 'S' } ], TableName: 'BookTable', KeySchema: [ { AttributeName: 'authorId', KeyType: 'HASH' }, { AttributeName: 'title', KeyType: 'RANGE' } ], TableArn: 'arn:aws:dynamodb:us-west-2:012345678910:table/BookTable', LocalSecondaryIndexes: [ { IndexName: 'authorId-bookId-index', KeySchema: [ { AttributeName: 'authorId', KeyType: 'HASH' }, { AttributeName: 'bookId', KeyType: 'RANGE' } ], Projection: { ProjectionType: 'ALL' }, IndexSizeBytes: 0, ItemCount: 0, IndexArn: 'arn:aws:dynamodb:us-west-2:012345678910:table/BookTable/index/authorId-bookId-index' } ], GlobalSecondaryIndexes: [ { IndexName: 'title-authorId-index', KeySchema: [ { AttributeName: 'title', KeyType: 'HASH' }, { AttributeName: 'authorId', KeyType: 'RANGE' } ], Projection: { ProjectionType: 'ALL' }, IndexArn: 'arn:aws:dynamodb:us-west-2:012345678910:table/BookTable/index/title-authorId-index' } ] } }

顶部的类型编辑器中显示以下内容:

type Book { # Key attributes. Changing these may result in unexpected behavior. authorId: String! title: String! # Index attributes. Changing these may result in unexpected behavior. bookId: String # Add additional non-key attributes below. isPublished: Boolean }

这个顶级编辑器是可写的,你需要手动添加底部编辑器中显示的非关键属性(例如,比如isPublished),因为它们无法从 DynamoDB 自动推断出来。例如,如果您的 DynamoDB 表中的某个项目有另一个名为的属性rating,则需要将其添加到下方才能将其填充isPublished到 GraphQL 架构中。在此示例中,底部编辑器中将显示以下建议的架构合并:

type Query { getBook(authorId: ID!, title: String!): Book listBooks(first: Int, after: String): BookConnection getBookByAuthorIdBookIdIndex(authorId: ID!, bookId: ID!): Book queryBooksByAuthorIdBookIdIndex(authorId: ID!, first: Int, after: String): BookConnection getBookByTitleAuthorIdIndex(title: String!, authorId: ID!): Book queryBooksByTitleAuthorIdIndex(title: String!, first: Int, after: String): BookConnection } type Mutation { createBook(input: CreateBookInput!): Book updateBook(input: UpdateBookInput!): Book deleteBook(input: DeleteBookInput!): Book } type Subscription { onCreateBook(authorId: ID, title: String, bookId: ID, isPublished: Boolean): Book @aws_subscribe(mutations: ["createBook"]) onUpdateBook(authorId: ID, title: String, bookId: ID, isPublished: Boolean): Book @aws_subscribe(mutations: ["updateBook"]) onDeleteBook(authorId: ID, title: String, bookId: ID, isPublished: Boolean): Book @aws_subscribe(mutations: ["deleteBook"]) } input CreateBookInput { authorId: ID! title: String! bookId: ID! isPublished: Boolean } input UpdateBookInput { authorId: ID! title: String! bookId: ID isPublished: Boolean } input DeleteBookInput { authorId: ID! title: String! } type BookConnection { items: [Book] nextToken: String }