PartiQL CLI(REPL)からDynamoDBを操作できるようになりました

2022.06.13

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

PartiQL CLI(REPR)がDyanamoDBに対応

PartiQLはSQL互換のクエリ言語で、DynamoDB、S3 Select、QLDBなど、AWSの様々なデータストアにクエリアクセスできます。

DynamoDBに PartiQLでアクセスする場合、以下の選択肢がありました。

  • DynamoDB コンソール
  • NoSQL Workbench
  • AWS Command Line Interface (AWS CLI)
  • DynamoDB APIs

PartiQLのリファレンス実装がOSSで公開されており、公開当初よりREPL機能も備わっているものの、PartiQL REPLからは外部のデータストアへアクセスできませんでした。

DynamoDBにSQLでアクセスするDQLのように、PartiQL REPLからもDynamoDBにアクセスできると便利だなぁと思っていたところ、そのものずばりの機能が実装されました

PartiQL> query_ddb('SELECT * FROM test WHERE id = 1');
==='
[
  {
    'name': 'john',
    'id': 1
  }
]
---
OK!

やってみた

本機能はmainブランチにマージされたばかりです。 最新リリースの v0.6 には取り込まれていないため、mainブランチのコードベースを利用して動作確認します。

AWSクレデンシャルの設定

AWSリソースにアクセスするため、次のドキュメントを参考にAWSのクレデンシャルを設定します。

Working with AWS Credentials - AWS SDK for Java

$HOME/.aws/ に設定、EC2のインスタンスプロファイル、環境変数など、設定方法は問いません。

REPLの起動

PartiQLのリファレンス実装はKotlinで実装されているため、JavaやGradleなどの環境は事前に整えておいてください。

ソースコードを取得し、ビルドして、CLIを起動するだけです。

$ git clone https://github.com/partiql/partiql-lang-kotlin.git
$ cd partiql-lang-kotlin
$ ./cli/shell.sh
...
Welcome to the PartiQL REPL!
Typing mode: LEGACY
Using version: 0.6.1-SNAPSHOT-3715b39
PartiQL>

$ ./cli/shell.sh の代わりに、以下のようにしても同じです。

$ ./gradlew :cli:install
$ ./cli/build/install/partiql-cli/bin/partiql

DynamoDBにPartiQLでアクセス

DynamoDBにアクセスするには、PartiQLの操作対象のデータソースがDynamoDBとなるよう、PartiQL文をquery_ddb 関数の引数で渡します。

PartiQL> query_ddb('SELECT * FROM test WHERE id = 1');
==='
[
  {
    'name': 'john',
    'id': 1
  }
]
---
OK!

PartiQL文にシングルクオートが含まれる場合、シングルクオートを連続させます。

PartiQL> query_ddb('INSERT INTO test VALUE({''id'':2, ''name'':''kate''})');
==='
[]
---
OK!

DynamoDBへのSELECT結果を、サブクエリ的に使うこともできます。

PartiQL> SELECT *
   |  FROM query_ddb('SELECT * FROM test')
   | WHERE id IN [1,3];
==='
<<
  {
    'name': 'lucy',
    'id': 3
  },
  {
    'name': 'john',
    'id': 1
  }
>>
---
OK!

この例では、SELECT文にWHERE句が含まれないため、フルテーブルスキャンが発生しています。

他のデータストアも対応させたい

他のデータストアにも対応さてたい場合、extensions/test/org/partiql/extensions/cli/functions/QueryDDBTest.kt のようなエクステンション・ライブラリ(薄いラッパー)を追加します。

この機能が取り込まれた PR #635 を眺めると、具体的な改修内容のイメージが湧きやすいと思います。

最後に

外部データストアに対応していなかったPartiQL REPL(シェル)がDynamoDBにアクセスできるようになりました。

コマンドラインからDynamoDBを操作したい人、DQLを使ってSQL操作をしている人にとっては、要チェックのアップデートです。

慣れ親しんだSQLインターフェースは便利ではあるものの、アクセスしているデータストアはRDBではなくDynamoDBです。 スキャン範囲に応じたIO課金が発生するため、SELECT文が意図しないフルテーブルスキャンとならないよう、ご注意ください。 IAMポリシーレベルでフルスキャンを防ぐこともできます。

Kotlin PartiQL実装にエクステンションを記述することで、他のデータストアにもかんたんに対応できるため、PartiQL REPLがサポートするデータストアは増えていきそうです。

今後のアップデートに期待です。

参考