PostgreSQLとPython
PyCon mini 広島
What is it?
PostgreSQLとPython
What is it?
一見関係なさそうですが…
What is it?
一見関係なさそうですが…
密接な関係があります!
What is it?
そんな2つの関係をご紹介します
あじぇんだ
1 自己紹介
2 PL/Python
3 FDWとPython
4 まとめ
あじぇんだ
1 自己紹介
2 PL/Python
3 FDWとPython
4 まとめ
自己紹介
名前:曽根 壮大(そね たけとも)
年齢:31歳(三人の子供がいます)
職業:Webエンジニア
所属:日本PostgreSQLユーザ会
   中国支部 支部長
  技術的にはLL系言語とかRDBが好きです
中国地方DB勉強会
https://dbstudychugoku.github.io/
岡山Python勉強会
https://okapython.doorkeeper.jp/
岡山Python勉強会
https://okapython.doorkeeper.jp/
ハングアウトでも参加可能!
あじぇんだ
1 自己紹介
2 PL/Python
3 FDWとPython
4 まとめ
PL/Python
PL/Python?
PL/Python
まずはPL/pgSQLの話
PL/Python
ストアドプロシージャ
を作るための機能
↓
DB内で手続き型な処理がしたい時に使う
PL/Python
ストアドプロシージャ
を作るための機能
↓
DB内で手続き型な処理がしたい時に使う
PL/Python
具体例
• ループさせたい(for文)
• 条件分岐したい(if文)
• データを加工したい
PL/Python
PL/pgSQLを使うメリット
(公式ドキュメントから引用)
•クライアント サーバ間において、不要
な中間処理の結果や通信を減らす
•一連の問い合わせに、複数の解析が不要
PL/Python
新しい言語覚えるの面倒
+
PL/pgSQLは読みにくい
PL/pgSQL
CREATE OR REPLACE FUNCTION fnc_test() RETURNS int AS $$
DECLARE
cs CURSOR FOR SELECT * FROM t_test;
rec record;
d...
PL/pgSQL
CREATE OR REPLACE FUNCTION fnc_test() RETURNS int AS $$
DECLARE
cs CURSOR FOR SELECT * FROM t_test;
rec record;
d...
PL/pgSQL
CREATE OR REPLACE FUNCTION fnc_test() RETURNS int AS $$
DECLARE
cs CURSOR FOR SELECT * FROM t_test;
rec record;
d...
PL/Python
そこでPL/Python!
PL/Python
PL/○○
•PHP
•Perl
•Ruby
•JavaScript
•R
•Java …etc
PL/Python
PL/○○
•PHP
•Perl
•Ruby
•JavaScript
•R
•Java …etc
他にも色々ある
PL/Python
CREATE OR REPLACE FUNCTION fnc_test() 
RETURNS SETOF int AS $$
import plpy
cs = plpy.execute("SELECT * FROM t_te...
PL/Python
CREATE OR REPLACE FUNCTION fnc_test() 
RETURNS SETOF int AS $$
import plpy
cs = plpy.execute("SELECT * FROM t_te...
PL/Python
CREATE OR REPLACE FUNCTION fnc_test() 
RETURNS SETOF int AS $$
import plpy
cs = plpy.execute("SELECT * FROM t_te...
PL/Python
既存のLibraryを再利用できる
PL/Python
既存のLibraryを再利用できる
↓
PyDataもNumPyも使える
PL/Python
既存のLibraryを再利用できる
↓
PyDataもNumPyも使える
Pythonはデータサイエンスと相性が良い
PL/Python
PL/Python
詳しいことは
@snagaさん
に聞くと良い(多分
PL/Python
DBの世界もこれで怖くない!
あじぇんだ
1 自己紹介
2 PL/Python
3 FDWとPython
4 まとめ
FDWとは
外部テーブルを作成するための機能
(外部のデータをtableにする)
FDWとは
外部データにテーブルと同様に
SQL文でアクセスできる
FDWとは
• WHEREやORDER BYが使える
• GROUP BYなどの集合関数も使える
• JOINなど、他tableと関連付け出来る
• 更新や削除も出来る(ただし9.3から)
FDWとは
外部データ
↓
DB、CSV、JSON、WebAPIなんでも良い
FDWとは
PostgreSQL
to
PostgreSQL
FDWとは
MySQL
to
PostgreSQL
FDWとは
MongoDB
to
PostgreSQL
FDWとは
Git
to
PostgreSQL
SQL Databases Wrappers
• postgres_fdw
• oracle_fdw
• mysql_fdw
• odbc_fdw
• jdbc_fdw
NoSQL Databases Wrappers
• couchdb_fdw
• MonetDB FDW
• mongo_fdw
• redis_fdw
• Neo4j fdw
• Tycoon FDW
Others
• git_fdw
• ldap_fdw
• IMAP_fdw
• s3_fdw
• www_fdw
• OS_fdw
FDWとは
その他に既に多くの実装がある
SQL Databases Wrappers
• postgres_fdw
• oracle_fdw
• mysql_fdw
• odbc_fdw
• jdbc_fdw
FDWを使う
MySQLPostgreSQL
FDWを使う
MySQLPostgreSQL
TABLE
FDWを使う
EXTENSION
MySQLPostgreSQL
TABLE
FDWを使う
EXTENSION
MySQLPostgreSQL
TABLE
mysql_fdwをインストールする
FDWを使う
server
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
FDWを使う
server
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
MySQLの接続先を設定する
MySQLの接続ユーザを設定する
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
PostgreSQLの外部tableを作成する
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
SQLで問い合わせ
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
SQLで問い合わせ
外部tableにアクセス
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
アクセス先を確認
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
MySQLにクエリを投げる
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
実行結果を取得
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
実行結果を表示
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
FDWを使う
server
FOREIGN
TABLE
EXTENSION
USER MAPPING
MySQLPostgreSQL
TABLE
Client
ここを作る
FDWを作る
現時点では
ほんの少しの元気と勇気と
PostgreSQLの内部構造に関する知識
がある程度必要です。
FDW超詳しい人
FDWを作る
なんか出来そう!!
FDWを作る
1週間後…
FDWを作る
圧倒的挫折…
FDWを作る
出来る人の簡単
FDWを作る
出来る人の簡単
↓
凡人の超えられない壁
FDWを作る
それなりの覚悟とちゃんとした
PostgreSQLとCの知識が必要
FDWを作る
でも大丈夫
FDWを作る
簡単にPythonで作る方法がある
FDWを作る
Multicorn
Multicorn
FDWを
Pythonで実装する
ためのLibrary
Multicorn
class hogeFDW(ForeignDataWrapper):
def __init__(self, options, columns):
super(hogeFDW, self).__init__(options, ...
Multicorn
class hogeFDW(ForeignDataWrapper):
def __init__(self, options, columns):
super(hogeFDW, self).__init__(options, ...
あじぇんだ
1 自己紹介
2 PL/Python
3 FDWとPython
4 まとめ
まとめ
PostgreSQLとPython
まとめ
PostgreSQLとPython
↓
実は仲良し
まとめ
OSやミドルウェアのレイヤでは
Pythonはデファクトスタンダード
と言って良い(多分
まとめ
Pythonを出来る
¦¦
インフラエンジニアとして有利!
まとめ
Pythonで視野を広げてみませんか?
参考資料
・公式ドキュメント(日本語)
https://www.postgresql.jp/document/9.4/html/postgres-fdw.html
・postgresql-jp Slack(チャットルーム)
https://po...
まとめ
Pythonを制するものは
インフラを制す
ご静聴ありがとうございました。
Upcoming SlideShare
Loading in...5
×

PostgreSQLとpython

762
-1

Published on

PyCon mini hiroshimaでの登壇資料です

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

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

No notes for slide

PostgreSQLとpython

  1. 1. PostgreSQLとPython PyCon mini 広島
  2. 2. What is it? PostgreSQLとPython
  3. 3. What is it? 一見関係なさそうですが…
  4. 4. What is it? 一見関係なさそうですが… 密接な関係があります!
  5. 5. What is it? そんな2つの関係をご紹介します
  6. 6. あじぇんだ 1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ
  7. 7. あじぇんだ 1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ
  8. 8. 自己紹介 名前:曽根 壮大(そね たけとも) 年齢:31歳(三人の子供がいます) 職業:Webエンジニア 所属:日本PostgreSQLユーザ会    中国支部 支部長   技術的にはLL系言語とかRDBが好きです
  9. 9. 中国地方DB勉強会 https://dbstudychugoku.github.io/
  10. 10. 岡山Python勉強会 https://okapython.doorkeeper.jp/
  11. 11. 岡山Python勉強会 https://okapython.doorkeeper.jp/ ハングアウトでも参加可能!
  12. 12. あじぇんだ 1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ
  13. 13. PL/Python PL/Python?
  14. 14. PL/Python まずはPL/pgSQLの話
  15. 15. PL/Python ストアドプロシージャ を作るための機能 ↓ DB内で手続き型な処理がしたい時に使う
  16. 16. PL/Python ストアドプロシージャ を作るための機能 ↓ DB内で手続き型な処理がしたい時に使う
  17. 17. PL/Python 具体例 • ループさせたい(for文) • 条件分岐したい(if文) • データを加工したい
  18. 18. PL/Python PL/pgSQLを使うメリット (公式ドキュメントから引用) •クライアント サーバ間において、不要 な中間処理の結果や通信を減らす •一連の問い合わせに、複数の解析が不要
  19. 19. PL/Python 新しい言語覚えるの面倒 + PL/pgSQLは読みにくい
  20. 20. PL/pgSQL CREATE OR REPLACE FUNCTION fnc_test() RETURNS int AS $$ DECLARE cs CURSOR FOR SELECT * FROM t_test; rec record; dum char; BEGIN OPEN cs; LOOP FETCH cs INTO rec; IF NOT FOUND THEN EXIT; END IF; RAISE NOTICE 'record is %', rec; END LOOP; CLOSE cs; RETURN 0; END; $$ LANGUAGE plpgsql;
  21. 21. PL/pgSQL CREATE OR REPLACE FUNCTION fnc_test() RETURNS int AS $$ DECLARE cs CURSOR FOR SELECT * FROM t_test; rec record; dum char; BEGIN OPEN cs; LOOP FETCH cs INTO rec; IF NOT FOUND THEN EXIT; END IF; RAISE NOTICE 'record is %', rec; END LOOP; CLOSE cs; RETURN 0; END; $$ LANGUAGE plpgsql; ループのスコープがわかりにくい
  22. 22. PL/pgSQL CREATE OR REPLACE FUNCTION fnc_test() RETURNS int AS $$ DECLARE cs CURSOR FOR SELECT * FROM t_test; rec record; dum char; BEGIN OPEN cs; LOOP FETCH cs INTO rec; IF NOT FOUND THEN EXIT; END IF; RAISE NOTICE 'record is %', rec; END LOOP; CLOSE cs; RETURN 0; END; $$ LANGUAGE plpgsql; ループのスコープがわかりにくい IFが直感的ではない
  23. 23. PL/Python そこでPL/Python!
  24. 24. PL/Python PL/○○ •PHP •Perl •Ruby •JavaScript •R •Java …etc
  25. 25. PL/Python PL/○○ •PHP •Perl •Ruby •JavaScript •R •Java …etc 他にも色々ある
  26. 26. PL/Python CREATE OR REPLACE FUNCTION fnc_test()  RETURNS SETOF int AS $$ import plpy cs = plpy.execute("SELECT * FROM t_test") for record in cs: yield record['text'] $$ LANGUAGE plpython2u;
  27. 27. PL/Python CREATE OR REPLACE FUNCTION fnc_test()  RETURNS SETOF int AS $$ import plpy cs = plpy.execute("SELECT * FROM t_test") for record in cs: yield record['text'] $$ LANGUAGE plpython2u; もちろんPython3も使える
  28. 28. PL/Python CREATE OR REPLACE FUNCTION fnc_test()  RETURNS SETOF int AS $$ import plpy cs = plpy.execute("SELECT * FROM t_test") for record in cs: yield record['text'] $$ LANGUAGE plpython2u; もちろんPython3も使える 既存のLibraryを再利用できる
  29. 29. PL/Python 既存のLibraryを再利用できる
  30. 30. PL/Python 既存のLibraryを再利用できる ↓ PyDataもNumPyも使える
  31. 31. PL/Python 既存のLibraryを再利用できる ↓ PyDataもNumPyも使える Pythonはデータサイエンスと相性が良い
  32. 32. PL/Python
  33. 33. PL/Python 詳しいことは @snagaさん に聞くと良い(多分
  34. 34. PL/Python DBの世界もこれで怖くない!
  35. 35. あじぇんだ 1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ
  36. 36. FDWとは 外部テーブルを作成するための機能 (外部のデータをtableにする)
  37. 37. FDWとは 外部データにテーブルと同様に SQL文でアクセスできる
  38. 38. FDWとは • WHEREやORDER BYが使える • GROUP BYなどの集合関数も使える • JOINなど、他tableと関連付け出来る • 更新や削除も出来る(ただし9.3から)
  39. 39. FDWとは 外部データ ↓ DB、CSV、JSON、WebAPIなんでも良い
  40. 40. FDWとは PostgreSQL to PostgreSQL
  41. 41. FDWとは MySQL to PostgreSQL
  42. 42. FDWとは MongoDB to PostgreSQL
  43. 43. FDWとは Git to PostgreSQL
  44. 44. SQL Databases Wrappers • postgres_fdw • oracle_fdw • mysql_fdw • odbc_fdw • jdbc_fdw
  45. 45. NoSQL Databases Wrappers • couchdb_fdw • MonetDB FDW • mongo_fdw • redis_fdw • Neo4j fdw • Tycoon FDW
  46. 46. Others • git_fdw • ldap_fdw • IMAP_fdw • s3_fdw • www_fdw • OS_fdw
  47. 47. FDWとは その他に既に多くの実装がある
  48. 48. SQL Databases Wrappers • postgres_fdw • oracle_fdw • mysql_fdw • odbc_fdw • jdbc_fdw
  49. 49. FDWを使う MySQLPostgreSQL
  50. 50. FDWを使う MySQLPostgreSQL TABLE
  51. 51. FDWを使う EXTENSION MySQLPostgreSQL TABLE
  52. 52. FDWを使う EXTENSION MySQLPostgreSQL TABLE mysql_fdwをインストールする
  53. 53. FDWを使う server EXTENSION USER MAPPING MySQLPostgreSQL TABLE
  54. 54. FDWを使う server EXTENSION USER MAPPING MySQLPostgreSQL TABLE MySQLの接続先を設定する MySQLの接続ユーザを設定する
  55. 55. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE
  56. 56. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE PostgreSQLの外部tableを作成する
  57. 57. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client
  58. 58. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client SQLで問い合わせ
  59. 59. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client SQLで問い合わせ 外部tableにアクセス
  60. 60. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client アクセス先を確認
  61. 61. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client MySQLにクエリを投げる
  62. 62. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client 実行結果を取得
  63. 63. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client 実行結果を表示
  64. 64. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client
  65. 65. FDWを使う server FOREIGN TABLE EXTENSION USER MAPPING MySQLPostgreSQL TABLE Client ここを作る
  66. 66. FDWを作る 現時点では ほんの少しの元気と勇気と PostgreSQLの内部構造に関する知識 がある程度必要です。 FDW超詳しい人
  67. 67. FDWを作る なんか出来そう!!
  68. 68. FDWを作る 1週間後…
  69. 69. FDWを作る 圧倒的挫折…
  70. 70. FDWを作る 出来る人の簡単
  71. 71. FDWを作る 出来る人の簡単 ↓ 凡人の超えられない壁
  72. 72. FDWを作る それなりの覚悟とちゃんとした PostgreSQLとCの知識が必要
  73. 73. FDWを作る でも大丈夫
  74. 74. FDWを作る 簡単にPythonで作る方法がある
  75. 75. FDWを作る Multicorn
  76. 76. Multicorn FDWを Pythonで実装する ためのLibrary
  77. 77. Multicorn class hogeFDW(ForeignDataWrapper): def __init__(self, options, columns): super(hogeFDW, self).__init__(options, columns) self.columns = columns def execute(self, quals, columns): #range(1,20)で20行の擬似TABLEを作る for i in range(1,20): # 値を返してあげる yield(i, "hoge")
  78. 78. Multicorn class hogeFDW(ForeignDataWrapper): def __init__(self, options, columns): super(hogeFDW, self).__init__(options, columns) self.columns = columns def execute(self, quals, columns): #range(1,20)で20行の擬似TABLEを作る for i in range(1,20): # 値を返してあげる yield(i, "hoge") WHERE句の中身 必ず適用される
  79. 79. あじぇんだ 1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ
  80. 80. まとめ PostgreSQLとPython
  81. 81. まとめ PostgreSQLとPython ↓ 実は仲良し
  82. 82. まとめ OSやミドルウェアのレイヤでは Pythonはデファクトスタンダード と言って良い(多分
  83. 83. まとめ Pythonを出来る ¦¦ インフラエンジニアとして有利!
  84. 84. まとめ Pythonで視野を広げてみませんか?
  85. 85. 参考資料 ・公式ドキュメント(日本語) https://www.postgresql.jp/document/9.4/html/postgres-fdw.html ・postgresql-jp Slack(チャットルーム) https://postgresql-hackers-jp.herokuapp.com/
  86. 86. まとめ Pythonを制するものは インフラを制す
  87. 87. ご静聴ありがとうございました。
  1. A particular slide catching your eye?

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

×