my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

25
OSS ユーザーのための勉強会 <OSS X Users Meeting> #6 PostgreSQL と MySQL Lighting-Talk 私的な PostgreSQL の楽しみ方 ぬこ@横浜 (@nuko_yokohama)

Transcript of my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

Page 1: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

OSS ユーザーのための勉強会 <OSS X Users Meeting> #6  

PostgreSQL と MySQL

Lighting-Talk私的な PostgreSQL の楽しみ方

ぬこ@横浜 (@nuko_yokohama)

Page 2: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

自己紹介「ぬこ@横浜」で検索

ラーメンの食べ歩きと無駄な PostgreSQL 拡張を考えるのが趣味

Page 3: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

さて、 MySQL と PostgreSQLどっち派なの?と聞かれたら躊躇なく PostgreSQL 派と私は答えちゃうわけですが

Page 4: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

なんで私が PostgreSQL をお気に入りなのか

Page 5: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

無駄に?機能拡張能力が

高いから

Page 6: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

ユーザ定義関数ユーザ定義型

独自インデックスForeign Data Wrapper

Background Worker ProcessCustom Scan API手続き言語ハンドラ

HOOK 組込etc ・・・

Page 7: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

面白いので自分でも

いくつか作った

Page 8: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

ユーザ定義型の例

漢数字型 (ksj)

Page 9: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

SELECT data, data + '拾 ' FROM ksj_sample; data | ?column? ------------+---------------- 五百壱拾六 | 五百弐拾六 零 | 壱拾 参万壱百壱 | 参万壱百壱拾壱(3 rows)

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)

漢数字で四則演算や

比較演算できます

Page 10: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

ユーザ定義型の例

ゆるい TEXT 型(ntext)

Page 11: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

SELECT * FROM foo WHERE data = '味噌らーめん '; id | data ----+-------------- 1 | 味噌ラーメン(1 row)

SELECT * FROM foo WHERE data = 'postgresql'; id | data ----+---------------------- 2 | PostgreSQL(1 row)

SELECT * FROM foo WHERE data = 'エバンゲリオン '; id | data ----+------------ 3 | エヴァンゲリヲン(1 row)

SELECT * FROM foo WHERE data = 'センヌリティウス '; id | data ----+------(0 rows)

SELECT * FROM foo WHERE data = 'フィロストラス '; id | data ----+------(0 rows)

SELECT * FROM foo WHERE data /= 'センヌリティウス '; id | data ----+------------------ 4 | セリヌンティウス(1 row)

SELECT * FROM foo WHERE data /= 'フィロストラス '; id | data ----+------------------ 5 | フィロストラトス(1 row)

日本語正規化+

typo を許容

Page 12: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

Foreign Data Wrapper の例

neo4j_fdw

Page 13: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

Neo4j Server

Neo4j Foriegn Data WrapperPostgreSQL

REST I/FCypherQuery

JSONResult

SQL

PostgreSQLRecord

Set Cypher Query

Execute Cypher Query on REST

Generate PostgreSQL Record

Neo4j-FDWConceptDo not convert SQL into Cypher!

Page 14: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

neo4j_fdw のデータソース

Page 15: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

CREATE EXTENSION neo4j_fdw;CREATE EXTENSIONCREATE SERVER foo FOREIGN DATA WRAPPER neo4j_fdw OPTIONS (url 'http://localhost:7474/db/data/cypher');CREATE SERVER

CREATE FOREIGN TABLE bar2 ( name text, follower_name text, follower_gender text) SERVER foo OPTIONS (query '{"query":"START n=node(*) MATCH p=n<-[]-fm RETURN n.name as name , fm.name as follower_name, fm.gender? as follower_gender " }');CREATE FOREIGN TABLE

SELECT name, follower_name, follower_gender FROM bar2; name | follower_name | follower_gender ---------+---------------+----------------- Yamato | Akagi | Famale Musashi | Yamato | Male Akagi | Hiryu | Famale Akagi | Yamato | Male Kaga | Hiryu | Famale Kaga | Musashi | Male Nagato | Mutsu | Male Nagato | Yamato | Male Mutsu | Nagato | Male Hiryu | Soryu | Famale Hiryu | Akagi | Famale Soryu | Hiryu | Famale(12 rows)

グラフデータベースのビューを定義して、

そこへ SQL で問い合わせ

Page 16: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

Background Worker Process の例

hit_and_blow

Page 17: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

hb_worker.so

Postgres server(9.3)

BackgroundWorker Process(libpqを使用 )

【 postgresql.conf】

shared_preload_libraries = 'hb_worker'hb_worker.conninfo = 'dbname=xxx user=yyy'

psql

チャネルHB_SV

チャネルHB_CL

NOTIFY HB_CL,'結果 ' NOTIFY HB_SV,'数字列 '

こんな感じ起動

LISTEN HB_CL

起動

LISTEN HB_SV

ロード・起動

数当て判定処理

Page 18: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

psql からの実行例postgres=# LISTEN HB_CL;LISTENpostgres=# NOTIFY HB_SV,'xxxx';;NOTIFYAsynchronous notification "hb_cl" with payload "Invalid data.(xxxx)" received from server process with PID 29520.postgres=# NOTIFY HB_SV,'0123';;NOTIFYAsynchronous notification "hb_cl" with payload "2 Hit / 1 Blow." received from server process with PID 29520.postgres=# NOTIFY HB_SV,'0813';;NOTIFYAsynchronous notification "hb_cl" with payload "4 Hit! Conguratulatoins!, next new game." received from server process with PID 29520.postgres=#

hb_worker の応答LOG: NOTIFY HB_CL,'2 Hit / 1 Blow.'LOG: hb_worker: NOTIFY HB_CL,'4 Hit! Conguratulatoins!, next new game.'

LOG: hb_worker: set secret number=0391

(注:見やすさのために適宜改行している)

psql から数当て

Page 19: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

HOOK の例

pg_heartman

Page 20: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

pg_heartman とは

Page 21: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

[nuko]$ LOG: loaded library "hartmanhook"LOG: database system was shut down at 2014-02-16 04:45:33 PSTLOG: database system is ready to accept connectionsLOG: autovacuum launcher started

[nuko]$ psql testpsql (9.3.2)Type "help" for help.

test=# SELECT 1;NOTICE: Sir, yes, sir! ?column? ---------- 1(1 row)

test=# \dNOTICE: Sir, yes, sir! List of relations Schema | Name | Type | Owner --------+------+-------+-------- public | test | table | harada(1 row)

test=#

SQL を投げるとハートマン軍曹から罵ってもらえます(現在実装中)

Page 22: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

実にくだらない

Page 23: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

でも、拡張機能を使って、こういう遊びが出来るのがPostgreSQL の

好きなところです

Page 24: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

時間が余ったらデモします

Page 25: my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

おしまい