LoginSignup
0
1

More than 1 year has passed since last update.

perlでSQLiteから取得したレコードをJSONで出力する

Last updated at Posted at 2021-11-11

概要

 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にして扱う方は少ないかもしれないけど、参考になれば幸いです。
 

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