今回はGraphQL
とAppSync
を扱って、DynamoDB
にデータを挿入する方法を記事にしてみました。
Schema
を定義する
以下のようにAppSync
のSchema
から定義することも可能なのですが、
私はAmplify CLI
で作成されるテンプレートであるschema.graphql
のファイルを直接編集することでデータを定義していきたいと思います。尚、schema.graphql
はAmplify
用のプロジェクトを準備するamplify init
コマンドを叩いた際に自動生成されます。この記事以降Amplify
のCLIコマンドを使いアプリを実装していくため、Schema
はプロジェクトファイルの方で定義していきます。
データの設計
ホテルの管理画面アプリを例にデータの設計を考えてみます。必要なデータは
カラム名 | 物理名 |
---|---|
宿泊部屋のタイプ(シングル、ダブルなど) | type |
部屋の状況(予約されているか、空室かなど) | status |
部屋番号 | number |
部屋の清掃状況 | houseKeeping |
宿泊者情報 | guestInfo |
宿泊者代表名 | name |
いつ来たのか | startedAt |
いつ帰るのか | leavesAt |
ざっとこんな感じですかね。
実際にSchemaに定義してみる
schema.graphql
には以下のように定義しました
type UserType @model {
id: ID!
type: String!
status: String!
number: String!
houseKeeping: [String]
guestInfo: GuestInfo
}
type GuestInfo {
name: String
startedAt: String
leavesAt: String
}
guestInfo
に中身をオブジェクトにし、name
、startedAt
、leavesAt
の3つを持つように設計しました。
続いてUserType
テーブル(テーブル名を自身で定義したもの)の中身に説明が必要なワード、記号について解説していきます。
@model
について
以下公式サイトから引用
GraphQL Transform 使用して、DynamoDB によってサポートされる API の最上位オブジェクトタイプを定義するディレクティブです。必要なすべての CRUDL (作成、読み取り、更新、削除、および一覧表示) クエリと変化、およびそのような変化の通知を受けるサブスクリプションを生成する
今回の例でいうと、UserType
テーブルが最上位のオブジェクトタイプになり、GuestInfo
が第2次のオブジェクトタイプになるため、UserType
の横に@model
をつけます。@model
をつけることにより、最上位のテーブル同士でデータのやり取りができるようになる@connection
など新たなディレクティブが使用できるようになります。
!
について
!
が意味することは「必ずデータを挿入しなければいけない」です。NOT NULL制約(undefined値、null値は受けつけない)ですね。今回の例で言えばguestInfo
のデータは挿入しなくてもいいけど、type
は入れなきゃエラーで怒られるよって定義することになります。必須フィールドには!
をつけましょう!
DynamoDBとの連携(create)
Schema
を定義した後、amplify push
コマンドを叩き、App Sync
にSchema
情報を登録しましょう。
Schema
がAppsync
に反映されたのを確認したら、いよいよクエリ言語のGraphQL
でデータを挿入してみます。
mutation user {
createUserType(input:{
status:"occupied"
number:"101"
type:"family"
houseKeeping:["clean"]
guestInfo: {
name:"Ichiro Suzuki"
startedAt:"2017-09-15"
leavesAt:"2017-09-18"
}
}) {
id
number
type
houseKeeping
guestInfo {
name
startedAt
leavesAt
}
}
}
{
"data": {
"createUserType": {
"id": "35dba6de-013a-45b9-bc21-165bdaded3ca",
"number": "101",
"type": "single",
"houseKeeping": [
"clean"
],
"guestInfo": {
"name": "Ichiro Suzuki",
"startedAt": "2017-09-15",
"leavesAt": "2017-09-18"
}
}
}
手順と一緒に解説していきます。
①Type
型の宣言
GraphQL
はリクエストのみのquery
、データを変更するmutation
、サーバーサイドからのイベントを通知できるsubscription
による3つのtype
型があります。今はデータを挿入したいのでmutation
を宣言します
mutation user {
ちなみにuser
の変数名は自由に変更できます
②クエリ実行
mutation
つまりデータの変更にはデータを新しく作るcreate
、削除するdelete
、更新するupdate
の3つがあります。
ここでイチロー選手がホテルに宿泊する新しいデータを作ってみましょう。そのために、create
+UserType
(テーブル名)を書いてあげます
createUserType(input:{
status:"occupied"
number:"101"
type:"family"
houseKeeping:["clean"]
guestInfo: {
name:"Ichiro Suzuki"
startedAt:"2017-09-15"
leavesAt:"2017-09-18"
}
・・・
③返して欲しいデータを書く
{
id
number
type
houseKeeping
guestInfo {
name
startedAt
leavesAt
}
}
}
このようにクエリを実行した後、返して欲しいデータを書きます。極端な話、id
だけでも大丈夫です。返して欲しくないデータがあれば、通信量などを考慮し、書かない選択も可能です
以上の手順を行うと、このようにDynamoDB
にデータが挿入されます。
DynamoDBとの連携(list)
次にテーブルのデータの一覧を取得したい場合のquery
型からlist
のクエリも実行してみたいと思います
query list {
listUserTypes {
items {
number
}
}
}
{
"data": {
"listUserTypes": {
"items": [
{
"number": "103"
},
{
"number": "202"
},
{
"number": "203"
},
{
"number": "403"
},
{
"number": "101"
},
{
"number": "402"
},
{
"number": "201"
},
{
"number": "401"
},
{
"number": "302"
},
{
"number": "303"
},
{
"number": "102"
},
{
"number": "301"
}
]
}
}
}
number
データが全て取得できました!
因みにnumber
は「数値型」の意味なので、命名としては良くないと言うご指摘を受けました。
roomNumber
などにするべきでしたね、、、、今後変数名には気をつけます!
次回はAmplify
の認証機能について記事を書いていこうと思います!