LoginSignup
3
1
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

SQL互換のクエリ言語「PartiQL」でDynamoDBを操作する

Last updated at Posted at 2024-01-05

概要

DynamoDBに関して学習をしている際、「DynamoDBでSQLライクなクエリが使える言語がある」ということを知り、興味を持ったので調査をしてみました。
→参照記事:https://www.publickey1.jp/blog/20/awsdynamodbsqlsqlpartiql.html
スクリーンショット 2024-01-01 22.15.33.png

PartiQLの特徴

AWS公式の説明には以下の記述がありました。

As long as your query engine supports PartiQL, you can process structured data from relational databases (both transactional and analytical), semi-structured and nested data in open data formats (such as an Amazon S3 data lake), and even schema-less data in NoSQL or document databases that allow different attributes for different rows.

  • SQLに似た構文で記述可能なクエリ言語
    • RDB以外の種類のDB(DynamoDB、DocumentDB、QLDBなど)に対してもSQLのようなクエリを実行することができる
    • 構造化データにとどまらず、半構造化データ(JSONなど)、ネストされたデータのようなデータ構造が複雑なデータセットに対してもクエリを実行することができる

PartiQLを実際に触ってみる

今回はNoSQLデータベースであるDynamoDBにおいて、PartiQLを実際に使用してみます。
検証にはNoSQL Workbenchを使用します。

NoSQL Workbench についての簡単な説明

Amazon DynamoDBなどのNoSQLデータベースを管理するためのビジュアライゼーションツール(こちらからダウンロードが出来ます。)
ダウンロード後の初期画面はこのような画面になっています。
スクリーンショット 2024-01-04 180357.png
全て英語で書かれているので、「どこに何が書かれているのか」を注意して読み解く必要がありそうですが、そこまで難しい内容は書かれていないので読解にはそこまで困らない印象でした。

Amazon DynamoDBと書かれている部分に、「Launch」ボタンがあるので、ボタンを押下すると下記のような画面に遷移すると思います。
スクリーンショット 2024-01-04 232712.png
Sample data models の部分を見れば何となく分かるかも知れませんが、AWS側でサンプルのデータセットを用意してくれているようです。個人的にテスト用のテーブルやデータを作成するのは少し煩わしかったのでありがたいなと思いました。
今回の検証では、Ski Resort Data Modelを使用することにします。

メニューバーに表示されている他の項目について(詳細については添付画像を参照)
Data modeler→各テーブルや、テーブルの属性についての情報(PK,SKなどの設定状況も)を閲覧
Visualizer→テーブルの情報を表形式で閲覧
Operation builder→実際にPartiQLでのクエリを記載し、その結果を閲覧

【Data modeler】→マネジメントコンソール>DynamoDBからでもデータの定義は変更できるがこちらの画面からでも変更可能
スクリーンショット 2024-01-04 233634.png
【Visualizer】
スクリーンショット 2024-01-04 234628.png
【Operation builder】→Runボタンでクエリが実行できる
スクリーンショット 2024-01-04 234708.png

INSERT,SELECT, UPDATE, DELETE

標準のSQLとほぼ変わりなくINSERT,SELECT, UPDATE, DELETE構文を使用することが可能です。
ポイントは、下図のようにリストに対しても操作ができることです。
下図では、OpenLifts(リスト)の0番目の要素をSELECTするクエリを書いており、正常に実行されていることが分かります。
ちなみにOpenLiftsは["16","13","10"]というような形でOpenLiftsカラムに格納されています。
(DynamoDBにおけるデータ型はNumbersetsです)
スクリーンショット 2024-01-04 230123.png

エイリアスが使えない、Bulk insert(update,delete)ができない(=一括でデータを操作することができない)、LIMITが使えないなど、一部標準のSQLでできることができないという制約はあるので注意が必要です。

PariQL特有の関数

PartiQL特有の関数について、簡単にまとめてみました。

Contains(AttributeName, 'XXX')

指定された属性が特定の値を含むかどうかを確認する
スクリーンショット 2024-01-04 235615.png

attribute_type(AttributeName, 'XXX')

指定された属性名が存在するかどうかを確認する
スクリーンショット 2024-01-05 000608.png

attribute_exists(AttributeName)

指定された属性が存在するかどうかを確認する
スクリーンショット 2024-01-04 173245.png

attribute_not_exists(AttributeName)

指定された属性が存在しないかどうかを確認する
スクリーンショット 2024-01-05 000222.png

begins_with(AttributeName, 'XXX')

指定された属性の値が特定のプレフィックスで始まるかどうかを確認する
スクリーンショット 2024-01-04 224003.png

標準SQLとPartiQLの比較表

標準SQLとPartiQLの比較について表形式でまとめてみました。

機能 標準SQL PartiQL
データモデル 厳格、テーブルベース スキーマレス、ドキュメントベース(JSON)
ネストされたデータに対するクエリ 基本的にはできない 可能
トランザクション サポート(ACID特性がある) 限定的
※DynamoDBの場合はJava SDK or AWS CLIを使えば実現できる(こちらを参照)
データ型の厳密さ 厳格(データ型の定義が必要) 柔軟(スキーマレスなので)

最後に

今回は、PartiQLで出来ることについて簡単にまとめてみましたが、標準のSQLを使う場合と比較してほぼ遜色なくデータ操作ができ便利だなという印象でした。
とはいうものの、どういったときにPartiQLのクエリを使うと有効なのか、という深いところまでの理解には及んでいないので、引き続き学習を続けていきたいと思っています。

参考文献

https://www.publickey1.jp/blog/20/awsdynamodbsqlsqlpartiql.html
https://aws.amazon.com/jp/blogs/opensource/announcing-partiql-one-query-language-for-all-your-data/
https://www.integrate.io/jp/blog/the-sql-vs-nosql-difference-ja/

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1