michimani.net

PartiQL が DynamoDB に対応したので AWS CLI を使って DynamoDB テーブルに SQL 文を実行してみる

2020-11-24

re:Invent 前の怒涛のアップデートが続く中で、 PartiQL が Amazon DynamoDB に対応したというアップデートが発表されました。これによって、 DynamoDB のテーブルに対して SQL 文を実行することができます。今回は、 AWS CLI 経由で DynamoDB のテーブルに対して SQL 文を実行してみます。

目次

概要

PartiQL が Amazon DynamoDB に対応し、DynamoDB のテーブルに対して SQL 文を実行できるようになりました。

PartiQL - A SQL-Compatible Query Language for Amazon DynamoDB - Amazon DynamoDB

PartiQL とは

PartiQL とは、 AWS がオープンソースとして公開している SQL 互換の問い合わせ言語です。CSV や JSON などのフォーマットで保存されているデータに対して、 SQL 文で操作を行うことができます。

Announcing PartiQL: One query language for all your data | AWS Open Source Blog

AWS CLI で試す

DynamoDB テーブルに対する SQL の実行は、マネジメントコンソール、 AWS SDK、 AWS CLI から行うことができます。今回は AWS CLI から SELECT 文を INSERT 文の実行を試してみます。

v2 は未対応

2020/11/24 時点で AWS CLI の v1/v2 それぞれの最新バージョンは下記のとおりです。

aws-cli-v1 $ aws --version
aws-cli/1.18.184 Python/3.8.5 Darwin/19.6.0 botocore/1.19.24
$ aws --version
aws-cli/2.1.3 Python/3.7.4 Darwin/19.6.0 exe/x86_64

DynamoDB テーブルに対して SQL 文を実行するときに使うコマンドは dynamodb execute-statement なのですが、 上記の時点で対応しているのは v1 のみです 今日 (2020/11/25) にリリースされた 2.1.4 で v2 でも利用できるようになっています。

なので、今回は 1.18.184 で実行していきます。

execute-statement コマンド

SQL の実行に使用する execute-statement コマンドは、次のようなパラメータを受け付けます。

$ aws dynamodb execute-statement help
...
SYNOPSIS
            execute-statement
          --statement <value>
          [--parameters <value>]
          [--consistent-read | --no-consistent-read]
          [--next-token <value>]
          [--cli-input-json <value>]
          [--generate-cli-skeleton <value>]

--statement オプションで SQL 文を指定する形になります。

SELECT 文

まずは SELECT 文を実行してみます。

$ aws dynamodb execute-statement \
--statement 'SELECT * FROM Thread;'

{
    "Items": [
        {
            "LastPostedDateTime": {
                "S": "2015-09-22T19:58:22.514Z"
            },
            "Replies": {
                "N": "0"
            },
            "Message": {
                "S": "CloudFront thread 1 message"
            },
            "LastPostedBy": {
                "S": "User A"
            },
            "Answered": {
                "N": "0"
            },
            "ForumName": {
                "S": "Amazon CloudFront"
            },
            "Tags": {
                "L": [
                    {
                        "S": "index"
                    },
                    {
                        "S": "primarykey"
                    },
                    {
                        "S": "table"
                    }
                ]
            },
            "Views": {
                "N": "10"
            },
            "Subject": {
                "S": "CloudFront Thread 1"
            }
        },
        {
            "LastPostedDateTime": {
                "S": "2015-09-29T19:58:22.514Z"
            },
            "Replies": {
                "N": "0"
            },
            "Message": {
                "S": "S3 thread 1 message"
            },
            "LastPostedBy": {
                "S": "User A"
            },
            "Answered": {
                "N": "0"
            },
            "Views": {
                "N": "0"
            },
            "ForumName": {
                "S": "Amazon S3"
            },
            "Tags": {
                "L": [
                    {
                        "S": "largeobjects"
                    },
                    {
                        "S": "multipart upload"
                    }
                ]
            },
            "Subject": {
                "S": "S3 Thread 1"
            }
        },
        {
            "LastPostedDateTime": {
                "S": "2015-09-22T19:58:22.514Z"
            },
            "Replies": {
                "N": "0"
            },
            "Message": {
                "S": "DynamoDB thread 1 message"
            },
            "LastPostedBy": {
                "S": "User A"
            },
            "Answered": {
                "N": "0"
            },
            "Views": {
                "N": "0"
            },
            "ForumName": {
                "S": "Amazon DynamoDB"
            },
            "Tags": {
                "L": [
                    {
                        "S": "index"
                    },
                    {
                        "S": "primarykey"
                    },
                    {
                        "S": "table"
                    }
                ]
            },
            "Subject": {
                "S": "DynamoDB Thread 1"
            }
        },
        {
            "LastPostedDateTime": {
                "S": "2015-09-15T19:58:22.514Z"
            },
            "Replies": {
                "N": "0"
            },
            "Message": {
                "S": "DynamoDB thread 2 message"
            },
            "LastPostedBy": {
                "S": "User A"
            },
            "Answered": {
                "N": "0"
            },
            "ForumName": {
                "S": "Amazon DynamoDB"
            },
            "Views": {
                "N": "0"
            },
            "Tags": {
                "L": [
                    {
                        "S": "items"
                    },
                    {
                        "S": "attributes"
                    },
                    {
                        "S": "throughput"
                    }
                ]
            },
            "Subject": {
                "S": "DynamoDB Thread 2"
            }
        }
    ]
}

INSERT 文

続いて、 INSERT 文で項目を追加してみます。

$ aws dynamodb execute-statement \
--statement "SELECT * FROM Thread WHERE ForumName='DynamoDB' AND Subject='PartiQL for DynamoDB';"

{
    "Items": []
}

正しく追加できたか確認してみます。

$ aws dynamodb execute-statement \
--statement "SELECT * FROM Thread WHERE ForumName='Amazon DynamoDB' AND Subject='PartiQL for DynamoDB';"

{
    "Items": [
        {
            "Message": {
                "S": "This is a sample SQL."
            },
            "ForumName": {
                "S": "Amazon DynamoDB"
            },
            "Subject": {
                "S": "PartiQL for DynamoDB"
            }
        }
    ]
}

まとめ

PartiQL が DynamoDB に対応したので AWS CLI を使って DynamoDB テーブルに SQL 文を実行してみた話でした。

正直、 AWS CLI から SQL 文を実行することはあまりないかと思います。むしろ、各 SDK から実行できるようになったことで、これまで取得し辛かった内容などは SQL 文を使うことで柔軟に取得できるようになるかもしれません。

以上、よっしー (michimani) でした。