LoginSignup
0
0

More than 3 years have passed since last update.

DynamoDBをSQL風に操作する

Posted at

前書き

DynamoDBを利用してProjectであるTableの一部でデータ(数万)を更新する必要あった。
わざわざScriptを作らないといけなのかとしらべたらSqlと同じ構文で操作できるしらべたところDynamoDB Query Languageの存在がが知るました。公式Documentはこちらで参照してください。
みんなさんも、DynamdoDBを利用しているProjectで開発時にちょっとしたテストするためにデータを更新する
ところmysqlのようにinsert, select, update, delete コマンドを使いたいですよね。DynamoDBにはそのような機能がないですが、
DQL(DynamoDB Query Language)を使って簡単に操作することできます。

CreateTableでTable作成したり、Alter Tableでprovision の設定変更したり、indexe追加・削除したりもできますが、dqlよりもcloudFormationで実行するのは正しいでしょうね。
それよりもデータの Tableの全てのfieldをUpdateした利、一定の条件にヒットする件数selectしたりには非常に役に立ちます。

今回は簡単なcities Tableの例でdqlで操作して見ます。(データはすべてダミーです)。

Pythonで書かれたインターフェイスですのでpipのインストルが必要です。

$ pip install -U dql

コマンドラインで以下のように実行することもできます。

$ dql -r ap-northeast-1 -c 'select * FROM cities'

シェルで実行するのは便利ですね。

$ dql -r ap-northeast-1
ap-northeast-1> select * FROM cities

Table 作成する

ap-northeast-1> create table cities (country string hash key, city string range key, population number) global index('city-population-idx', city, population);
Created table 'cities'

Table作成時Provisionの設定したりなどいろいろ設定もできる。こちらから参照してください。

ファイルからデータLoadする

ファイルに準備したデータをコマンド1行でimportすることができる。
city.json ファイルを準備して以下にコマンド実行しました。

{"country": "japan", "city": "tokyo", "population": 1000000}
{"country": "japan", "city": "osaka", "population": 500000}
{"country": "japan", "city": "nagoya", "population": 500000}
{"country": "china", "city": "shangai", "population": 5000000}
{"country": "korea", "city": "seol", "population": 100000}
ap-northeast-1> load city.json into cities;
Loaded 5 items

データを参照する(Select)

import したデータを以下のコマンド確認できる。

ap-northeast-1> scan * from cities;
-------------------------------------
|    city   | country |  population |
-------------------------------------
| 'shangai' | 'china' | 5000000  |
| 'nagoya'  | 'japan' | 500000   |
| 'osaka'   | 'japan' | 500000  |
| 'tokyo'   | 'japan' | 1000000 |
| 'seol'    | 'korea' | 1000000   |
-------------------------------------

scan の代わりにselectを使いこともできますが、selectを利用するためには
ap-northeast-1> opt allow_select_scan true
を実行する必要ある。

insert分でデータを追加する(Insert)

Insert分は普通にSQLと同じく実行しました。

ap-northeast-1> INSERT INTO cities (country, city, population) VALUES ('japan', 'fukuoka', 200000);
Inserted 1 item
ap-northeast-1> select * from cities;
-------------------------------------
|    city   | country |  population |
-------------------------------------
| 'shangai' | 'china' | 5000000  |
| 'fukuoka' | 'japan' | 200000    |
| 'nagoya'  | 'japan' | 500000   |
| 'osaka'   | 'japan' | 500000  |
| 'tokyo'   | 'japan' | 1000000 |
| 'seol'    | 'korea' | 1000000  |
-------------------------------------

データを更新する(Update)

sqlと同じ公文で更新することができる。

ap-northeast-1> update cities set population = 2000000 where city='fukuoka';Updated 1 item
ap-northeast-1> select * from cities;
-------------------------------------
|    city   | country |  population |
-------------------------------------
| 'shangai' | 'china' | 5000000  |
| 'fukuoka' | 'japan' | 2000000     |
| 'nagoya'  | 'japan' | 500000   |
| 'osaka'   | 'japan' | 500000  |
| 'tokyo'   | 'japan' | 1000000 |
| 'seol'    | 'korea' | 1000000  |
-------------------------------------

データを削除する(Delete)

削除も同じ構文でできる。

ap-northeast-1> delete from cities where city='shangai';
Deleted 1 item
ap-northeast-1> select * from cities;
-------------------------------------
|    city   | country |  population |
-------------------------------------
| 'fukuoka' | 'japan' | 2000000     |
| 'nagoya'  | 'japan' | 500000000   |
| 'osaka'   | 'japan' | 5000000000  |
| 'tokyo'   | 'japan' | 10000000000 |
| 'seol'    | 'korea' | 100000000   |
-------------------------------------

最後に

必要な簡単例で操作してみましたが、sqlと同じ構文で実行できて非常に楽です。
実行はAWSのcredentialsの設定は完了している前提です。
今回sqlでよく利用する構文しか紹介してないですが公式ドキュメントを参照して
ください。

0
0
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
0
0