概要
SQLiteにperlにて問い合わせ、取得レコードをJSONに変換して返す方法についてまとめます。サーバサイドでの処理を想定しています。
クライアントとなるwebブラウザ上でピボットテーブルを実現するpivottable.jsや一覧表示用リストのtabulator.jsをよく使用しており、JSON形式だとモジュールにそのまま渡すだけなので、とても楽なんです。
使うモジュール
- DBIx::Simple もしくは DBIx::Custom
- JSON::PP
- メソッド〔encode_json〕がperlのハッシュの配列のリファレンスをJSONに変換してくれる
DBIx::Simple, DBIx::Customモジュールについての補足
- DBIx::Simple
- 生のSQLを書かなくて良くなり、便利機能がある
- サンプルは英語だけれど、わかりやすい、調べれば日本語情報も充実している
- DBIx::Custom
- 作者が日本語ドキュメント、サンプルを作成しており、敷居が低く利用しやすい
- 高機能であり、メンテナンスが継続されている
さらに、2つには受け取ったレコードをハッシュの配列にして一括で取得するメソッドがあるのです。
DBIにもハッシュを取得するメソッドはありますが、1レコードずつなので、配列にpushするなどの工夫がいります。
使用するSQLiteのサンプルについて
- SQLiteのデータはutf8で格納
- テーブル名「SAMPLE」
ID | ITEM |
---|---|
1 | りんご |
2 | みかん |
3 | ぶどう |
実装
【DBIx::Simple】を用いた方法
dbtest1.pl
#!perl
use strict;
use warnings;
use DBIx::Simple;
use JSON::PP;
use utf8;
my $connectdb = "./sample.sqlite";
my $db = DBIx::Simple->connect(
"dbi:SQLite:dbname=$connectdb",
"", # ID
"", # PASSWORD
{sqlite_unicode => 1} # ユニコード使うよ
);
my $result = $db->select(
'SAMPLE', '*', {ID => "2"}
);
my $all = $result->hashes; # レコードをすべて取得
my $json = encode_json($all);
print $json;
結果
[{"id":"2","item":"みかん"}]
【DBIx::Custom】を用いた方法
dbtest2.pl
#!perl
use strict;
use warnings;
use DBIx::Custom;
use JSON::PP;
use utf8;
my $connectdb = "./sample.sqlite";
my $dbi = DBIx::Custom->connect(
dsn => "dbi:SQLite:dbname=$connectdb",
option => {sqlite_unicode => 1},
);
my $result = $dbi->select(
table => 'SAMPLE',
where => {ID => "2"}
);
my $all = $result->all; # すべて取得
my $json = encode_json($all);
print $json;
結果
[{"id":"2","item":"みかん"}]
おわりに
perlで取得レコード群をJSONにして扱う方は少ないかもしれないけど、参考になれば幸いです。