OSS ユーザーのための勉強会
<OSS X Users Meeting> #6  
PostgreSQL と MySQL
Lighting-Talk
私的な PostgreSQL の楽しみ方
ぬこ@横浜 (@nuko_yokohama)
自己紹介
「ぬこ@横浜」で検索
ラーメンの食べ歩きと
無駄な PostgreSQL 拡張を考えるのが趣味
さて、 MySQL と PostgreSQL
どっち派なの?と聞かれたら
躊躇なく PostgreSQL 派と
私は答えちゃうわけですが
なんで
私が PostgreSQL を
お気に入りなのか
無駄に?
機能拡張能力が
高いから
ユーザ定義関数
ユーザ定義型
独自インデックス
Foreign Data Wrapper
Background Worker Process
Custom Scan API
手続き言語ハンドラ
HOOK 組込
etc ・・・
面白いので
自分でも
いくつか作った
ユーザ定義型の例
漢数字型 (ksj)
SELECT data, data + ' 拾 ' FROM ksj_sample;
data | ?column?
------------+----------------
五百壱拾六 | 五百弐拾六
零 | 壱拾
参万壱百壱 | 参万壱百...
ユーザ定義型の例
ゆるい TEXT 型
(ntext)
SELECT * FROM foo WHERE data = ' 味噌らーめん ';
id | data
----+--------------
1 | 味噌ラーメン
(1 row)
SELECT * FROM foo WHERE data =...
Foreign Data
Wrapper の例
neo4j_fdw
Neo4j Server
Neo4j Foriegn Data Wrapper
PostgreSQL
REST I/FCypher
Query
JSON
Result
SQL
PostgreSQL
Record
Set Cypher Query...
neo4j_fdw のデータソース
CREATE EXTENSION neo4j_fdw;
CREATE EXTENSION
CREATE SERVER foo
FOREIGN DATA WRAPPER neo4j_fdw
OPTIONS (url 'http://localho...
Background Worker
Process の例
hit_and_blow
hb_worker.so
Postgres server(9.3)
Background
Worker Process
(libpq を使用 )
【 postgresql.conf 】
shared_preload_libraries = 'h...
psql からの実行例
postgres=# LISTEN HB_CL;
LISTEN
postgres=# NOTIFY HB_SV,'xxxx';;
NOTIFY
Asynchronous notification "hb_cl" with...
HOOK の例
pg_heartman
pg_heartman とは
[nuko]$ LOG: loaded library "hartmanhook"
LOG: database system was shut down at 2014-02-16 04:45:33 PST
LOG: database syst...
実に
くだらない
でも、拡張機能を
使って、こういう
遊びが出来るのが
PostgreSQL の
好きなところです
時間が余ったら
デモします
おしまい
Upcoming SlideShare
Loading in...5
×

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

998

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
998
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
5
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. OSS ユーザーのための勉強会 <OSS X Users Meeting> #6   PostgreSQL と MySQL Lighting-Talk 私的な PostgreSQL の楽しみ方 ぬこ@横浜 (@nuko_yokohama)
  2. 2. 自己紹介 「ぬこ@横浜」で検索 ラーメンの食べ歩きと 無駄な PostgreSQL 拡張を考えるのが趣味
  3. 3. さて、 MySQL と PostgreSQL どっち派なの?と聞かれたら 躊躇なく PostgreSQL 派と 私は答えちゃうわけですが
  4. 4. なんで 私が PostgreSQL を お気に入りなのか
  5. 5. 無駄に? 機能拡張能力が 高いから
  6. 6. ユーザ定義関数 ユーザ定義型 独自インデックス Foreign Data Wrapper Background Worker Process Custom Scan API 手続き言語ハンドラ HOOK 組込 etc ・・・
  7. 7. 面白いので 自分でも いくつか作った
  8. 8. ユーザ定義型の例 漢数字型 (ksj)
  9. 9. 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) 漢数字で 四則演算や 比較演算できます
  10. 10. ユーザ定義型の例 ゆるい TEXT 型 (ntext)
  11. 11. 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 を許容
  12. 12. Foreign Data Wrapper の例 neo4j_fdw
  13. 13. Neo4j Server Neo4j Foriegn Data Wrapper PostgreSQL REST I/FCypher Query JSON Result SQL PostgreSQL Record Set Cypher Query Execute Cypher Query on REST Generate PostgreSQL Record Neo4j-FDW Concept Do not convert SQL into Cypher!
  14. 14. neo4j_fdw のデータソース
  15. 15. CREATE EXTENSION neo4j_fdw; CREATE EXTENSION CREATE 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 で問い合わせ
  16. 16. Background Worker Process の例 hit_and_blow
  17. 17. hb_worker.so Postgres server(9.3) Background Worker 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 ロード・起動 数当て判定処理
  18. 18. psql からの実行例 postgres=# LISTEN HB_CL; LISTEN postgres=# NOTIFY HB_SV,'xxxx';; NOTIFY Asynchronous notification "hb_cl" with payload "Invalid data.(xxxx)" received from server process with PID 29520. postgres=# NOTIFY HB_SV,'0123';; NOTIFY Asynchronous notification "hb_cl" with payload "2 Hit / 1 Blow." received from server process with PID 29520. postgres=# NOTIFY HB_SV,'0813';; NOTIFY Asynchronous 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 から数当て
  19. 19. HOOK の例 pg_heartman
  20. 20. pg_heartman とは
  21. 21. [nuko]$ LOG: loaded library "hartmanhook" LOG: database system was shut down at 2014-02-16 04:45:33 PST LOG: database system is ready to accept connections LOG: autovacuum launcher started [nuko]$ psql test psql (9.3.2) Type "help" for help. test=# SELECT 1; NOTICE: Sir, yes, sir! ?column? ---------- 1 (1 row) test=# d NOTICE: Sir, yes, sir! List of relations Schema | Name | Type | Owner --------+------+-------+-------- public | test | table | harada (1 row) test=# SQL を投げると ハートマン軍曹から 罵ってもらえます (現在実装中)
  22. 22. 実に くだらない
  23. 23. でも、拡張機能を 使って、こういう 遊びが出来るのが PostgreSQL の 好きなところです
  24. 24. 時間が余ったら デモします
  25. 25. おしまい
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×