67
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQLite3のJSON機能が便利だった

Posted at

#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と相性の良い言語では、これを使わない手は無いと思う

67
51
3

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
67
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?