#SQLite3のJSON
SQLite3.9からJSON関連の機能が追加されたのはSqlite 3.9 の Json1を試した で詳しく紹介されている
今回、Node.jsでプログラミングしている際、データの保存を簡単にできないかと試していたら、SQLiteのJSONが想像以上に便利だったので、その部分を伝えたい
## 1.テーブルの作成
create table json_table(name text primary key,value json)
単純なテーブルの作成。データの型をjsonにしているが、SQLiteでは現時点でテキストデータとして保存される
## 2.データの挿入
replace into json_table values('aaaa',json_array(1,2,3));
replace into json_table values('bbbb',json_object('あいうえお','ABC'));
replace into json_table values('cccc','{"abcd":123}')
insertではなくreplaceで挿入しているのは、Node.jsからデータを書き換える際に変数のように使用するためだ。他のDBにも上書き挿入はあるが、SQLiteのreplace文が一番扱いが簡単だ
ちなみにJSONのデータを入力する際は、json_arrayやjson_objectで入れても良いし、文字列の形でもかまわない
## 3.データの抽出
### 3.1普通にselect
select * from json_table
name | value |
---|---|
aaaa | [1,2,3] |
bbbb | {"あいうえお":"ABC"} |
cccc | {"abcd":123} |
普通にselectすると普通に結果が返ってくる。jsonなので、受け取るときの形式は文字列だ
### 3.2オブジェクト一つにまとめて抽出
select json_group_object(name,json(value)) from json_table
json_group_object(name,json(value)) |
---|
{"aaaa":[1,2,3],"bbbb":{"あいうえお":"ABC"},"cccc":{"abcd":123}} |
今回、無茶苦茶便利だと思った結果がこれだ。json_group_objectを使うと、複数のレコードを1つのJSONオブジェクトとしてまとめてくれる。たったこれだけと思うかもしれない。しかし受け取り側で余計な処理を加えずに、一発でデータを取得できるのはとにかく便利なのだ
### 3.3配列一つにまとめて抽出
select json_group_array(json_object(name,json(value))) from json_table
json_group_array(json_object(name,json(value))) |
---|
[{"aaaa":[1,2,3]},{"bbbb":{"あいうえお":"ABC"}},{"cccc":{"abcd":123}}] |
複数の結果を配列一つにまとめて返す。これも便利なので、そのうち使うことがあるかもしれない
## まとめ
JSONを扱うことに関しては、NoSQL系のDBを選択した方が便利かもしれない。しかしSQL系のDBもJSON機能が当たり前のように使えるようになった現在、後者を使った方が速度と利便性の良いとこ取り出来るのだ。特にJSONと相性の良い言語では、これを使わない手は無いと思う