👻

Amplify CLI API(GraphQL)/Data modeling

2023/08/13に公開

使い方

amplify add api
amplify push
yarn install aws-amplify
  • アプリのエントリポイントに以下を貼り付ける
import { Amplify, API, graphqlOperation } from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
  • schemaを更新したい場合は、amplify/backend/api/<api-name>/schema.graphqlファイルで以下を実行
amplify api gql-compile
amplify push
  • モデルの削除、名前の変更、モデルのpkの変更、モデルのローカルセカンダリインデックスの変更などがある場合はDynamoDBテーブルの置き換えが必須になる。pushするとエラーメッセージが出るので、続行するには以下を実行(開発環境でのみ推奨)
amplify push --allow-destructive-graphql-schema-updates
  • Rebuild
amplify rebuild api

Data modeling

  • @modelでは自動的にidがpkとしてデータベースに保存される。主キーをカスタマイズするには@primaryKeyをpkにしたいフィールドに追加する。(一度設定するとDBを再生成しないといけなくなる)
  • 異なるフィールドの組み合わせをpkとするsortkeyがある。指定したsortkeyにより高度なソートやフィルタリングが可能となる。以下例
type Inventory @model {
  productID: ID! @primaryKey(sortKeyFields: ["warehouseID"])
  warehouseID: ID!
  InventoryAmount: Int!
}
  • amplify pushの際にschemaに基づいてcrudなどのgraphql apiが自動生成される。@modelではcreateAtとupdateAtが自動追加される。

  • セカンダリインデックスの設定

    • そもそもDynamoDBについて少しおさらい
    • keyとvalueの組み合わせで情報を管理するキーバリュー型のデータベース
    • プライマリキーはパーティションキー、パーティションキーとソートキーの組み合わせ。
    • セカンダリインデックスはプライマリキー以外の属性でデータを抽出できるようにする仕組み。もう一つpk,sk設定するイメージ。

リレーション

relation description
@hasOne 1vs1
@hasMany 1vsN
@belongsTo 1vs1, 1vsNを双方向に設定できる
@manyToMany NvsN
  • hasOne
type Project @model {
  id: ID!
  name: String
  team: Team @hasOne
}

type Team @model {
  id: ID!
  name: String!
}
  • hasMany
type Post @model {
  id: ID!
  title: String!
  comments: [Comment] @hasMany
}

type Comment @model {
  id: ID!
  content: String!
}
  • belongsTo
type Project @model {
  id: ID!
  name: String
  team: Team @hasOne
}

type Team @model {
  id: ID!
  name: String!
  project: Project @belongsTo
}
  • manayToMany
type Post @model {
  id: ID!
  title: String!
  content: String
  tags: [Tag] @manyToMany(relationName: "PostTags")
}

type Tag @model {
  id: ID!
  label: String!
  posts: [Post] @manyToMany(relationName: "PostTags")
}

Discussion