[アップデート]PartiQLを使ったDynamoDBのCRUD操作が可能になりました

NoSQL未経験の方がDynamoDBに挑戦するハードルが下がりました
2020.11.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部@大阪の岩田です。

2020/11/23付けのアップデートにより、PartiQLを利用したDynamoDBのCRUD操作が可能になりました

これまでDynamoDBのテーブルデータを操作するにはGetItemやPutItemといった独自の操作を利用する必要がありましたが、今後はPartiQLを利用した操作方法を選択することも可能になりました。PartiQLはSQL互換のクエリ言語なので、RDBの利用経験がある人が新たにDynamoDBに挑戦する際のハードルが下がったのでは無いでしょうか?

PartiQLを利用したDynamoDBのオペレーションにおいても、GetItemやPutItemといった従来のオペレーションと同等の可用性、レイテンシー、パフォーマンスが提供されるとのことで、PartiQLを利用したからパフォーマンスが上がる/下がるといったことは無いようです。純粋に利用者側から利用しやすいオペレーションを選択すれば良さそうですね。

現在DynamoDBのPartiQLサポートは以下のリージョンで利用可能です

  • 北カリフォルニア(us-west-1)
  • オレゴン(us-west-2)
  • バージニア北部(us-east-1)
  • アイルランド (eu-west-1)
  • 東京(ap-northeast-1)
  • ソウル(ap-northeast-2)

そもそもPartiQLって何??

PartiQLはAWSがOSSとして公開したSQL互換のクエリ言語です。PartiQLを利用することで、RDBだけではなく、NoSQLデータベース、JSONやParquetといったファイル等、様々なデータソースに対して統一されたインターフェースでアクセスすることが可能です。詳細については以下のエントリもご参照下さい。

AWSのサービスだと、台帳型データベースのQLDBなんかもPartiQLを利用してクエリを実行しますね。

※QLDBはPartiQLを完全サポートしているわけではなく、PartiQLのサブセットをサポートしているという形になります。

やってみる

早速PartiQLによるDynamoDBの操作を試してみましょう。

既に公式ドキュメント

  • マネコン
  • AWS CLI
  • Java

3パターンによるPartiQLの使用方法が紹介されています。今回は公式ドキュメントの内容に沿ってAWS CLIからPariQLを利用しつつマネコンからデータを確認してみます。

なお、利用したAWS CLIのバージョンは以下の通りです。

$ aws --version
aws-cli/1.18.184 Python/3.8.3 Darwin/19.5.0 botocore/1.19.24

テーブルの作成

まずはテストに利用するテーブルを作成します。以下のコマンドでチュートリアルの定番Musicテーブルを作成します。

$aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST

INSERTしてみる

まずはアイテムをINSERTしてみましょう。AWS CLIからPartiQLを実行する際は execute-statement の引数にクエリを指定します。以下のコマンドでMusicテーブルへのINSERT文を実行します。

$aws dynamodb execute-statement --statement \
    "INSERT INTO Music  \
    VALUE  \
    {'Artist':'Acme Band','SongTitle':'PartiQL Rocks'}"

マネコンからMusicテーブルの中身を確認してみましょう。

無事にINSERTできていることが分かります。

SELECTしてみる

続いて先程INSERTしたアイテムをSELECTしてみます

$aws dynamodb execute-statement --statement \
    "SELECT * FROM Music   \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

実行完了すると以下のようなレスポンスが返却されます。

{
    "Items": [
        {
            "Artist": {
                "S": "Acme Band"
            },
            "SongTitle": {
                "S": "PartiQL Rocks"
            }
        }
    ]
}

UPDATEしてみる

続いてUPDATE文を何パターンか試してみます。

まずはUPDATE文によるアトリビュートの追加です。

$aws dynamodb execute-statement --statement \
    "UPDATE Music  \
    SET AwardsWon=1  \
    SET AwardDetail={'Grammys':[2020, 2018]}  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンからアイテムの内容を確認してみましょう。

AwardsWonAwardDetail2つのアトリビュートが追加されたことが分かります。

続いてUPDATE文を利用してリスト型のアトリビュートに項目を追加してみましょう。先程追加したアトリビュートAwardDetail.Grammysに2016年を追加します。

$aws dynamodb execute-statement --statement \
    "UPDATE Music  \
    SET AwardDetail.Grammys =list_append(AwardDetail.Grammys,[2016])  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンから確認します。

AwardDetail.Grammysに2018が追加されています。

続いてUPDATE文を利用してリスト型のアトリビュートから項目を削除してみます。AwardDetail.Grammysから2要素目を削除します。

$aws dynamodb execute-statement --statement \
    "UPDATE Music  \
    REMOVE AwardDetail.Grammys[2]  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンを確認します。

AwardDetail.Grammysから2016が削除されています。

次はマップ型のアトリビュートに項目を追加してみます。

$aws dynamodb execute-statement --statement \
    "UPDATE Music  \
    SET AwardDetail.BillBoard=[2020]  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンを確認します。

AwardDetailBillBoardというキーが追加されています。

続いてセット型のアトリビュートを追加してみます。

$aws dynamodb execute-statement --statement \
    "UPDATE Music  \
    SET BandMembers =<<'member1', 'member2'>>  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンを確認します。

BandMembersというアトリビュートが追加されています。ついでに表示がDynamoDB JSON形式に変わりました。

次はセット型のアトリビュートに項目を追加してみます。

$aws dynamodb execute-statement --statement \
    "UPDATE Music  \
    SET BandMembers =set_add(BandMembers, <<'newmember'>>)  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンを確認します。

BandMembersというアトリビュートにnewmemberという値が追加されています。

DELETE してみる

最後にアイテムをDELETEしてみましょう。

$aws dynamodb execute-statement --statement \
    "DELETE  FROM Music  \
    WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"

マネコンを確認すると...

テーブルの中身が空っぽです。DELETE成功ですね。

注意点

このようにPartiQLによるCRUD操作が可能になりましたが、PartiQLはあくまでもDynamoDBのオペレーションを実行するためのフロントエンドのインターフェースであり、バックエンドはあくまでDynamoDBであることに注意が必要です。つまりDynamoDBにできないことはできません。例えばですが、複数テーブルのJOINやGROUP BYによる集計処理などは実施できませんし、UPDATE文で指定できるUPDATE対象は1アイテムのみです。複数アイテムをUPDATEするような条件をWHERE句に指定したUPDATE文を実行すると、エラーが返却されます。逆にできることとしては、BatchWriteItemやTransactWriteItemsといったオペレーションはPartiQLからでも問題なく実行可能です。

このあたりは公式ドキュメントに情報がまとまっているのでご一読下さい。

まとめ

DynamoDBのPartiQLサポートについてご紹介しました。今後は各言語のSDKもPartiQLによるオペレーションに対応し、PartiQLによる開発が可能になると予想されます。プロジェクトメンバーのスキルセット次第ではPartiQLによるオペレーションを選択することでPJをスムーズに進められる可能性があります。選択肢として検討してみてはいかがでしょうか?