87
PostgreSQLPython PyCon mini 広島

PostgreSQLとpython

Embed Size (px)

Citation preview

Page 1: PostgreSQLとpython

PostgreSQLとPython

PyCon mini 広島

Page 2: PostgreSQLとpython

What is it?

PostgreSQLとPython

Page 3: PostgreSQLとpython

What is it?

一見関係なさそうですが…

Page 4: PostgreSQLとpython

What is it?

一見関係なさそうですが…

密接な関係があります!

Page 5: PostgreSQLとpython

What is it?

そんな2つの関係をご紹介します

Page 6: PostgreSQLとpython

あじぇんだ

1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ

Page 7: PostgreSQLとpython

あじぇんだ

1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ

Page 8: PostgreSQLとpython

自己紹介名前:曽根 壮大(そね たけとも) 年齢:31歳(三人の子供がいます) 職業:Webエンジニア

所属:日本PostgreSQLユーザ会

   中国支部 支部長

  技術的にはLL系言語とかRDBが好きです

Page 9: PostgreSQLとpython

中国地方DB勉強会

https://dbstudychugoku.github.io/

Page 10: PostgreSQLとpython

岡山Python勉強会

https://okapython.doorkeeper.jp/

Page 11: PostgreSQLとpython

岡山Python勉強会

https://okapython.doorkeeper.jp/

ハングアウトでも参加可能!

Page 12: PostgreSQLとpython

あじぇんだ

1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ

Page 13: PostgreSQLとpython

PL/Python

PL/Python?

Page 14: PostgreSQLとpython

PL/Python

まずはPL/pgSQLの話

Page 15: PostgreSQLとpython

PL/Python

ストアドプロシージャ を作るための機能

↓ DB内で手続き型な処理がしたい時に使う

Page 16: PostgreSQLとpython

PL/Python

ストアドプロシージャ を作るための機能

↓ DB内で手続き型な処理がしたい時に使う

Page 17: PostgreSQLとpython

PL/Python

具体例

• ループさせたい(for文) • 条件分岐したい(if文) • データを加工したい

Page 18: PostgreSQLとpython

PL/Python

PL/pgSQLを使うメリット (公式ドキュメントから引用)

•クライアント⇔サーバ間において、不要な中間処理の結果や通信を減らす •一連の問い合わせに、複数の解析が不要

Page 19: PostgreSQLとpython

PL/Python

新しい言語覚えるの面倒 +

PL/pgSQLは読みにくい

Page 20: PostgreSQLとpython

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;

Page 21: PostgreSQLとpython

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;

ループのスコープがわかりにくい

Page 22: PostgreSQLとpython

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が直感的ではない

Page 23: PostgreSQLとpython

PL/Python

そこでPL/Python!

Page 24: PostgreSQLとpython

PL/Python

PL/○○

•PHP •Perl •Ruby •JavaScript •R •Java …etc

Page 25: PostgreSQLとpython

PL/Python

PL/○○

•PHP •Perl •Ruby •JavaScript •R •Java …etc

他にも色々ある

Page 26: PostgreSQLとpython

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;

Page 27: PostgreSQLとpython

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も使える

Page 28: PostgreSQLとpython

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を再利用できる

Page 29: PostgreSQLとpython

PL/Python

既存のLibraryを再利用できる

Page 30: PostgreSQLとpython

PL/Python

既存のLibraryを再利用できる ↓

PyDataもNumPyも使える

Page 31: PostgreSQLとpython

PL/Python

既存のLibraryを再利用できる ↓

PyDataもNumPyも使えるPythonはデータサイエンスと相性が良い

Page 32: PostgreSQLとpython

PL/Python

Page 33: PostgreSQLとpython

PL/Python

詳しいことは

@snagaさん

に聞くと良い(多分

Page 34: PostgreSQLとpython

PL/Python

DBの世界もこれで怖くない!

Page 35: PostgreSQLとpython

あじぇんだ

1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ

Page 36: PostgreSQLとpython

FDWとは

外部テーブルを作成するための機能 (外部のデータをtableにする)

Page 37: PostgreSQLとpython

FDWとは

外部データにテーブルと同様に SQL文でアクセスできる

Page 38: PostgreSQLとpython

FDWとは

• WHEREやORDER BYが使える • GROUP BYなどの集合関数も使える • JOINなど、他tableと関連付け出来る • 更新や削除も出来る(ただし9.3から)

Page 39: PostgreSQLとpython

FDWとは

外部データ ↓

DB、CSV、JSON、WebAPIなんでも良い

Page 40: PostgreSQLとpython

FDWとは

PostgreSQL to

PostgreSQL

Page 41: PostgreSQLとpython

FDWとは

MySQL to

PostgreSQL

Page 42: PostgreSQLとpython

FDWとは

MongoDB to

PostgreSQL

Page 43: PostgreSQLとpython

FDWとは

Git to

PostgreSQL

Page 44: PostgreSQLとpython

SQL Databases Wrappers • postgres_fdw • oracle_fdw • mysql_fdw • odbc_fdw • jdbc_fdw

Page 45: PostgreSQLとpython

NoSQL Databases Wrappers• couchdb_fdw • MonetDB FDW • mongo_fdw • redis_fdw • Neo4j fdw • Tycoon FDW

Page 46: PostgreSQLとpython

Others• git_fdw • ldap_fdw • IMAP_fdw • s3_fdw • www_fdw • OS_fdw

Page 47: PostgreSQLとpython

FDWとは

その他に既に多くの実装がある

Page 48: PostgreSQLとpython

SQL Databases Wrappers • postgres_fdw • oracle_fdw • mysql_fdw • odbc_fdw • jdbc_fdw

Page 49: PostgreSQLとpython

FDWを使うMySQLPostgreSQL

Page 50: PostgreSQLとpython

FDWを使うMySQLPostgreSQL

TABLE

Page 51: PostgreSQLとpython

FDWを使う

EXTENSION

MySQLPostgreSQL

TABLE

Page 52: PostgreSQLとpython

FDWを使う

EXTENSION

MySQLPostgreSQL

TABLE

mysql_fdwをインストールする

Page 53: PostgreSQLとpython

FDWを使う

server

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Page 54: PostgreSQLとpython

FDWを使う

server

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

MySQLの接続先を設定する

MySQLの接続ユーザを設定する

Page 55: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Page 56: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

PostgreSQLの外部tableを作成する

Page 57: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client

Page 58: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

ClientSQLで問い合わせ

Page 59: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

ClientSQLで問い合わせ

外部tableにアクセス

Page 60: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client

アクセス先を確認

Page 61: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client

MySQLにクエリを投げる

Page 62: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client

実行結果を取得

Page 63: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client実行結果を表示

Page 64: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client

Page 65: PostgreSQLとpython

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

Client

ここを作る

Page 66: PostgreSQLとpython

FDWを作る

現時点では ほんの少しの元気と勇気と

PostgreSQLの内部構造に関する知識 がある程度必要です。

FDW超詳しい人

Page 67: PostgreSQLとpython

FDWを作る

なんか出来そう!!

Page 68: PostgreSQLとpython

FDWを作る

1週間後…

Page 69: PostgreSQLとpython

FDWを作る

圧倒的挫折…

Page 70: PostgreSQLとpython

FDWを作る

出来る人の簡単

Page 71: PostgreSQLとpython

FDWを作る

出来る人の簡単 ↓

凡人の超えられない壁

Page 72: PostgreSQLとpython

FDWを作る

それなりの覚悟とちゃんとした PostgreSQLとCの知識が必要

Page 73: PostgreSQLとpython

FDWを作る

でも大丈夫

Page 74: PostgreSQLとpython

FDWを作る

簡単にPythonで作る方法がある

Page 75: PostgreSQLとpython

FDWを作る

Multicorn

Page 76: PostgreSQLとpython

Multicorn

FDWを Pythonで実装する ためのLibrary

Page 77: PostgreSQLとpython

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")

Page 78: PostgreSQLとpython

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句の中身 必ず適用される

Page 79: PostgreSQLとpython

あじぇんだ

1 自己紹介 2 PL/Python 3 FDWとPython 4 まとめ

Page 80: PostgreSQLとpython

まとめ

PostgreSQLとPython

Page 81: PostgreSQLとpython

まとめ

PostgreSQLとPython ↓

実は仲良し

Page 82: PostgreSQLとpython

まとめ

OSやミドルウェアのレイヤでは Pythonはデファクトスタンダード

と言って良い(多分

Page 83: PostgreSQLとpython

まとめ

Pythonを出来る ||

インフラエンジニアとして有利!

Page 84: PostgreSQLとpython

まとめ

Pythonで視野を広げてみませんか?

Page 85: PostgreSQLとpython

参考資料

・公式ドキュメント(日本語) https://www.postgresql.jp/document/9.4/html/postgres-fdw.html

・postgresql-jp Slack(チャットルーム) https://postgresql-hackers-jp.herokuapp.com/

Page 86: PostgreSQLとpython

まとめ

Pythonを制するものは インフラを制す

Page 87: PostgreSQLとpython

ご静聴ありがとうございました。