
Contents
実行環境 関連リンクと過去記事 PostgreSQL 用の汎用ウェブアクセス関数を、PL/Python で作成 作った関数のテスト(以上、昨日) - PL/Python
で作ったウェブアクセス関数を、PL/v8 から使う (3)WebAPI の例として、MediaWiki API からデータを取得(1月7日) (4)関数の改良(ⅰ)JSON を処理して pageid を直接返す(1月8日) (5)関数の改良(ⅱ)複数行に対するウェブアクセスを、ウィンドウ関数で 1 回にまとめる(1月9日、終)
PL/Python で作ったウェブアクセス関数を、PL/v8 から使う
他のvar res = plv8.execute('任意のクエリ'); -- 結果がJSON配列で返る
昨日の自作関数を使う前に ↓ 適当なクエリを打って結果の取り出し方をテスト。無名コードブロックを使い、クエリ結果の全体と一部を
do language plv8 $$ var sql = 'select * from pg_extension', -- 適当なクエリ res = plv8.execute(sql); plv8.elog(INFO, '結果全体(配列)', JSON.stringify(res), '\n'); plv8.elog(INFO, '結果の1行目', JSON.stringify(res[0]), '\n'); plv8.elog(INFO, '結果の1行目の特定の列', JSON.stringify(res[0]['extname'])); $$; INFO: 結果全体(配列) [{"extname":"plpgsql","extowner":10,"extnamespace":11,"extr elocatable":false,"extversion":"1.0","extconfig":null,"extcondition":null},{"extn ame":"plv8","extowner":10,"extnamespace":11,"extrelocatable":false,"extversion":" 1.4.2","extconfig":null,"extcondition":null},{"extname":"plpython3u","extowner":1 0,"extnamespace":11,"extrelocatable":false,"extversion":"1.0","extconfig":null,"e xtcondition":null}] INFO: 結果の1行目 {"extname":"plpgsql","extowner":10,"extnamespace":11,"extreloc atable":false,"extversion":"1.0","extconfig":null,"extcondition":null} INFO: 結果の1行目の特定の列 "plpgsql" DO

PL/v8
- 関数がバイナリを返すので、文字コードを指定してテキストに戻す → クエリで
convert_from 関数を使う - WebAPI
の JSON を取得 & 処理する場合、クエリ結果から取り出した状態は単なる文字列なので改めて JSON にパースする → PL/v8 内で JSON.parse 関数を使う
実際に
do language plv8 $$ var url = 'http://kenpg.bitbucket.org/blog/201601/04.html', enc = 'utf8', sql = "select convert_from(plpy_urlopen('" + url + "'), '" + enc + "')", res = plv8.execute(sql), htm = res[0]['convert_from']; plv8.elog(INFO, typeof htm); plv8.elog(INFO, htm); $$;

↓
do language plv8 $$ var keyword = 'postgres', url = 'https://en.wikipedia.org/w/api.php?action=query&format=json' + '&titles=' + keyword, enc = 'utf8', sql = "select convert_from(plpy_urlopen('" + url + "'), '" + enc + "')", res = plv8.execute(sql), dat = JSON.parse(res[0]['convert_from']); plv8.elog(INFO, typeof dat); plv8.elog(INFO, dat); plv8.elog(INFO, JSON.stringify(dat)); $$; INFO: object INFO: [object Object] INFO: {"batchcomplete":"","query":{"normalized":[{"from":"postgres","to":"Postgr es"}],"pages":{"290657":{"pageid":290657,"ns":0,"title":"Postgres"}}}} DO

上を、今回