Name:
interface
Value:
Amplify has re-imagined the way frontend developers build fullstack applications. Develop and deploy without the hassle.
Maintenance ModeYou are viewing Amplify Gen 1 documentation. Amplify Gen 1 has entered maintenance mode and will reach end of life on May 1, 2027. New project should use Amplify Gen 2. For existing Gen 1 projects, a migration guide and tooling are available to help you upgrade. Switch to the latest Gen 2 docs →

モデル型を定義する

You are currently viewing the legacy GraphQL Transformer documentation. View latest documentation

@model

@model で注釈が付けられたオブジェクト型は、生成されたAPIのトップレベルエンティティです。@model で注釈が付けられたオブジェクトはAmazon DynamoDBに保存され、@auth を介して保護したり、@connection を介して他のオブジェクトに関連付けたり、@searchable を介してAmazon OpenSearchにストリーミングしたりすることができます。また、@versioned ディレクティブを適用して、バージョンフィールドと競合検出をモデル型に即座に追加することもできます。

定義

以下のSDLは、Amazon DynamoDBに支援されたAPIのトップレベルオブジェクト型を簡単に定義できる @model ディレクティブを定義しています。

directive @model(
queries: ModelQueryMap
mutations: ModelMutationMap
subscriptions: ModelSubscriptionMap
timestamps: TimestampConfiguration
) on OBJECT
input ModelMutationMap {
create: String
update: String
delete: String
}
input ModelQueryMap {
get: String
list: String
}
input ModelSubscriptionMap {
onCreate: [String]
onUpdate: [String]
onDelete: [String]
level: ModelSubscriptionLevel
}
enum ModelSubscriptionLevel {
off
public
on
}
input TimestampConfiguration {
createdAt: String
updatedAt: String
}

使用方法

GraphQLオブジェクト型を定義し、@model ディレクティブで注釈を付けて、そのタイプのオブジェクトをDynamoDBに保存し、CRUDL クエリとミューテーションを自動的に設定します。

type Post @model {
id: ID! # id: ID! is a required attribute.
title: String!
tags: [String!]!
}

生成されたクエリ、ミューテーション、サブスクリプションの名前をオーバーライドするか、操作を完全に削除することもできます。

type Post
@model(queries: { get: "post" }, mutations: null, subscriptions: null) {
id: ID!
title: String!
tags: [String!]!
}

これにより、単一のクエリフィールド post(id: ID!): Post が作成・設定され、ミューテーションフィールドは生成されません。

Model ディレクティブは、各エンティティに createdAt および updatedAt タイムスタンプを自動的に追加します。タイムスタンプフィールド名は、timestamps 属性をディレクティブに渡すことで変更できます。

type Post
@model(timestamps: { createdAt: "createdOn", updatedAt: "updatedOn" }) {
id: ID!
title: String!
tags: [String!]!
}

上記のスキーマは、以下に示すように createdOn および updatedOn フィールドを持つPost を生成します。

type Post {
id: ID!
title: String!
tags: [String!]!
createdOn: AWSDateTime!
updatedOn: AWSDateTime!
}

自動的に追加される createdAt および updatedAt フィールドは、作成または更新ミューテーションで設定することはできません。これらのフィールドをミューテーションの一部として制御する必要がある場合、それらは入力スキーマに含める必要があり、型として AWSDateTime を持つ必要があります。

type Post @model {
id: ID!
title: String!
tags: [String!]!
createdAt: AWSDateTime!
updatedAt: AWSDateTime!
}

生成

単一の @model ディレクティブは以下のAWSリソースを設定します。

  • デフォルトでPAY_PER_REQUEST課金モードが有効になっているAmazon DynamoDBテーブル。
  • 上記のテーブルにアクセスするよう設定されたAWS AppSync データソース。
  • AWS AppSyncがあなたの代わりに上記のテーブルを呼び出すことができるようにするデータソースに接続されたAWS IAMロール。
  • 最大8つのリゾルバー(作成、更新、削除、取得、リスト、onCreate、onUpdate、onDelete)ですが、これは @model ディレクティブの queriesmutations、および subscriptions 引数を介して設定できます。
  • 作成、更新、削除ミューテーション用の入力オブジェクト。
  • リストクエリおよび接続フィールド内のオブジェクトをフィルタリングできるフィルタ入力オブジェクト。
  • リストクエリの場合、デフォルトで返されるオブジェクト数は100です。limit 引数を設定することで、この動作をオーバーライドできます。

この入力スキーマドキュメント

type Post @model {
id: ID!
title: String
metadata: MetaData
}
type MetaData {
category: Category
}
enum Category {
comedy
news
}

は以下のスキーマパーツを生成します。

type Post {
id: ID!
title: String!
metadata: MetaData
createdAt: AWSDatetime
updatedAt: AWSDateTime
}
type MetaData {
category: Category
}
enum Category {
comedy
news
}
input MetaDataInput {
category: Category
}
enum ModelSortDirection {
ASC
DESC
}
type ModelPostConnection {
items: [Post]
nextToken: String
}
input ModelStringFilterInput {
ne: String
eq: String
le: String
lt: String
ge: String
gt: String
contains: String
notContains: String
between: [String]
beginsWith: String
}
input ModelIDFilterInput {
ne: ID
eq: ID
le: ID
lt: ID
ge: ID
gt: ID
contains: ID
notContains: ID
between: [ID]
beginsWith: ID
}
input ModelIntFilterInput {
ne: Int
eq: Int
le: Int
lt: Int
ge: Int
gt: Int
contains: Int
notContains: Int
between: [Int]
}
input ModelFloatFilterInput {
ne: Float
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
contains: Float
notContains: Float
between: [Float]
}
input ModelBooleanFilterInput {
ne: Boolean
eq: Boolean
}
input ModelPostFilterInput {
id: ModelIDFilterInput
title: ModelStringFilterInput
and: [ModelPostFilterInput]
or: [ModelPostFilterInput]
not: ModelPostFilterInput
}
type Query {
getPost(id: ID!): Post
listPosts(
filter: ModelPostFilterInput
limit: Int
nextToken: String
): ModelPostConnection
}
input CreatePostInput {
title: String!
metadata: MetaDataInput
}
input UpdatePostInput {
id: ID!
title: String
metadata: MetaDataInput
}
input DeletePostInput {
id: ID
}
type Mutation {
createPost(input: CreatePostInput!): Post
updatePost(input: UpdatePostInput!): Post
deletePost(input: DeletePostInput!): Post
}
type Subscription {
onCreatePost: Post @aws_subscribe(mutations: ["createPost"])
onUpdatePost: Post @aws_subscribe(mutations: ["updatePost"])
onDeletePost: Post @aws_subscribe(mutations: ["deletePost"])
}