my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

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

  • 779 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
779
On Slideshare
759
From Embeds
20
Number of Embeds
3

Actions

Shares
Downloads
4
Comments
0
Likes
2

Embeds 20

https://cybozulive.com 9
https://twitter.com 7
http://www.slideee.com 4

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. OSS ユーザーのための勉強会 <OSS X Users Meeting> #6   PostgreSQL と MySQL Lighting-Talk 私的な PostgreSQL の楽しみ方 ぬこ@横浜 (@nuko_yokohama)
  • 2. 自己紹介 「ぬこ@横浜」で検索 ラーメンの食べ歩きと 無駄な PostgreSQL 拡張を考えるのが趣味
  • 3. さて、 MySQL と PostgreSQL どっち派なの?と聞かれたら 躊躇なく PostgreSQL 派と 私は答えちゃうわけですが
  • 4. なんで 私が PostgreSQL を お気に入りなのか
  • 5. 無駄に? 機能拡張能力が 高いから
  • 6. ユーザ定義関数 ユーザ定義型 独自インデックス Foreign Data Wrapper Background Worker Process Custom Scan API 手続き言語ハンドラ HOOK 組込 etc ・・・
  • 7. 面白いので 自分でも いくつか作った
  • 8. ユーザ定義型の例 漢数字型 (ksj)
  • 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. ユーザ定義型の例 ゆるい TEXT 型 (ntext)
  • 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. Foreign Data Wrapper の例 neo4j_fdw
  • 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. neo4j_fdw のデータソース
  • 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. Background Worker Process の例 hit_and_blow
  • 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. 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. HOOK の例 pg_heartman
  • 20. pg_heartman とは
  • 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. 実に くだらない
  • 23. でも、拡張機能を 使って、こういう 遊びが出来るのが PostgreSQL の 好きなところです
  • 24. 時間が余ったら デモします
  • 25. おしまい