DynamoDBをSQL風に操作する

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

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の設定したりなどいろいろ設定もできる。[こちら](https://dql.readthedocs.io/en/latest/topics/queries/create.html)から参照してください。


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

```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でよく利用する構文しか紹介してないですが公式ドキュメントを参照して
ください。