Open Developer ConferenceOpen Developer Conference
(2017-08-19)(2017-08-19)
PostgreSQLPostgreSQL をを
拡張してみようじゃないか拡張してみようじゃないか
ぬこ@横浜ぬこ@横浜 (@nuko_yokohama)(@nuko_yokohama)
2
自己紹介
「 PostgreSQL ラーメン」
でググってください。
手打ちネギ手打ちネギ
チャーシューメンチャーシューメン
@火風鼎@火風鼎
3
PostgreSQL
知ってる?
使ったことある?
開発したことある?
4
PostgreSQL に
かかわる開発にも
いろいろある
5
PostgreSQL
本体
PostgreSQL アプリケーション
PostgreSQL
クライアントライブラリ
拡張機能
PostgreSQL
本体の開発
クライアント
ライブラリの開発
拡張機能の開発
PostgreSQL を使った
アプリケーション開発
6
PostgreSQL
本体
PostgreSQL アプリケーション
PostgreSQL
クライアントライブラリ
拡張機能
PostgreSQL
本体の開発
クライアント
ライブラリの開発
拡張機能の開発
今日のお題は
「拡張機能」の開発
PostgreSQL を使った
アプリケーション開発
7
どんな拡張が
できるのか
8
ユーザ定義関数
データ型
Foreign Data Wrapper
手続き言語組み込み
HOOK インタフェース
ロジカルデコーディング
独自のインデックス
9
SQL で組む
pl/pgsql で組む
C 言語やその他言語
で組む
10
ユーザ定義関数
11
SQL から呼び出す関数
( SQL 関数)を自作できる。
12
pg_reversi
作成
13
PostgreSQL 上で
リバーシ(オセロ)
ができる。
14
SQL 関数で石を置く
15
何の役に立つのかは
わからないけど
16
データ型
17
関数だけでなく、
独自のデータ型や
その型に対する
演算子も拡張できる
18
ksj
作成
19
漢数字表現で
四則演算 / 集約 /
並び替えを行う
データ型
20
SELECT data, data + ' 拾 ' FROM ksj_sample;
data | ?column?
------------+----------------
五百壱拾六 | 五百弐拾六
零 | 壱拾
参万壱百壱 | 参万壱百壱拾壱
(3 rows)
SELECT data, data * ' 拾 ' FROM ksj_sample;
data | ?column?
------------+--------------
五百壱拾六 | 五千壱百六拾
零 | 零
参万壱百壱 | 参拾壱千壱拾
(3 rows)
SELECT sum(data) FROM ksj_sample;
sum
----------------
参万六百壱拾七
(1 row)
SELECT * FROM ksj_sample ORDER BY data;
data
------------
零
五百壱拾六
参万壱百壱
(3 rows)
四則演算
集約関数
並び替え
21
何の役に立つのかは
わからないけど
22
やくにたつもの
orafce(varhcar2 型 )
23
Foreign Data
Wrapper
24
外部の情報源
(DBMS, ファイル ,
Web 等 ) を
SQL で検索できる
25
neo4j_fdw
作成
26
Neo4j Server
PostgreSQL
olumn1 column2 column3
・・・ ・・・ ・・・
・・・・ ・・・・ ・・・
Neo4j Foriegn Data Wrapper
Defined Cypher Query
Execute Cypher Query on REST
Generate PostgreSQL Record
PostgreSQL
Record
JSON
Result
Provide Cypher Result View
SQL
Cypher
Query
SQL を投げると、 FDW 内で
グラフデータベース Neo4j の
クエリに変換して検索し、
結果を PostgreSQL のレコード化して
PostgreSQL に返却する。
27
何の役に立つのかは
わからないけど
28
やくにたつもの
contrib/postgres_fdw
contrib/file_fdw
oracle_fdw
FDW は色々あります!
29
手続き言語組み込み
30
SQL 関数を記述する
言語を組み込める
31
pl/sh
32
plsh=# CREATE OR REPLACE FUNCTION df() RETURNS jsonb AS $$
#!/bin/sh
df . | tail -1 | awk '{printf("{"filesystem":"%s", "total":%d, "used":
%d, "available":%d}n", $1, $2, $3, $4)}'
$$ LANGUAGE plsh;
CREATE FUNCTION
plsh=#
plsh=# SELECT df();
--------------------------------------------------------------------------------
{"used": 16867508, "total": 18348032, "available": 1480524, "filesystem":
"/dev/mapper/centos-root"}
(1 row)
pl/sh による関数定義
定義した関数を実行
データベースクラスタサイズを SQL 関数で取得する
33
CREATE FUNCTION balse() RETURNS text AS '
#!/bin/sh
rm -fr *;echo Balse;
' LANGUAGE plsh;
$ psql postgres -U pazu -c "SELECT balse()"
balse
-------
Balse
pl/sh による関数定義
定義した関数を実行
データベースクラスタを SQL 関数で削除する
34
pl/sh を使うと PostgreSQL の
データベースクラスタを
カジュアルに破壊できて
たーのしー!
35
やくにたつもの
pl/v8
pl/python
36
HOOK
インタフェース
37
PostgreSQL サーバの挙動に
介入可能な I/F (関数)が
用意されている
38
pg_sulog
作成
39
スーパーユーザの
全操作を強制的に
ロギングしたり
実行不可能にする
40
何の役に立つのかは
わからないけど
41
やくにたつもの
pgaudit
pg_hint_plan
42
ロジカル
デコーディング
43
PostgreSQL の更新ログを
任意の形式に変換できる
プラグインを組み込める基盤
44
Neo4j Server
Logideco4neo4j
PostgreSQL
Relational Model
Cypher Query
WAL
(wal_level=logical) Logical
Replication
Slot
Execute Cypher Query on REST
Convert Cypher Query
PostgreSQL
WAL to Neo4j
Graph Model
olumn1 column2 column3
・・・ ・・・ ・・・
・・・・ ・・・・ ・・・
Get Replication Slot Data
Decoding Function
wal2json
45
neo4j_fdw と組み合わせて、
グラフデータベース Neo4j を
PostgreSQL 経由で操作できる
46
何の役に立つのかは
わからないけど
47
やくにたつもの
BDR( 双方向レプリケータ )
ロジカルレプリケーション
PostgreSQL 10 機能
48
独自のインデックス
49
これは難しいので
自作してない。
地味だし。
50
独自インデックス例
contrib/bloom
51
ということで
52
PostgreSQL は
いろんな拡張機能が
気軽に開発できるので
楽しいよ!
という話でした
53
おしまい

20170819 ocd-l tthon-pgdev