PostgreSQLとpython

Preview:

Citation preview

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; 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;

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;

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

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

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_test") for record in cs: yield record['text'] $$ LANGUAGE plpython2u;

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

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

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

ClientSQLで問い合わせ

FDWを使う

server

FOREIGN TABLE

EXTENSION

USER MAPPING

MySQLPostgreSQL

TABLE

ClientSQLで問い合わせ

外部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, columns) self.columns = columns

def execute(self, quals, columns): #range(1,20)で20行の擬似TABLEを作る for i in range(1,20): # 値を返してあげる yield(i, "hoge")

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

あじぇんだ

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://postgresql-hackers-jp.herokuapp.com/

まとめ

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

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

Recommended