PostgreSQLへ各種言語から繋ぎたい

  • 15
    Like
  • 2
    Comment
More than 1 year has passed since last update.

この記事はPostgreSQL Advent Calendar 2015 の4日目です。3日目はkasa_zip様でした。

ここ数年、データ分析の分野が大変賑わっています。大規模となるとSpark/Hadoopのあたりが必要かもしれませんが、ある程度の規模であればRDBMSで十分対応できます。特にPostgreSQLはJSONサポートも豊富ですので、中規模までの分析基盤であれば十分ではないでしょうか。

ということで、各言語からPostgreSQLに接続するためのドライバ・モジュールを整理してみます。

※JavaとPython以外が薄いのはあまり触ってないからです…

Javaの場合

PostgerSQL JDBCドライバが提供されていますので、こちらを使いましょう。
download

jdbc.png

使用するJDBCドライバを選ぶときは、実行環境のJDKのバージョンを元に選びます。例えばJDK 1.8の場合はJDBC42のドライバが必要になるので、9.4 build 1202-1206の何れかを使用します。PostgreSQLの通信プロトコルは7.4以降共通のため、9.4のドライバを使用しても7.4以降のPostgreSQLへ接続することは何ら問題ありません。利用するJDKに対応した最新のドライバを使用すればよいでしょう。

なお、PostgreSQLのJDBCドライバはPure Javaのためlibpqを必要とせず、単体で動作しますのでダウンロードしたドライバのみCLASSPATHに追加すればよいでしょう。

Pythonの場合

Pythonの場合は、PostgreSQL wikiにまとまっています。
jdbc1.png

表にもありますが、Pythonでは複数のドライバが提供されています。割と名前をよく耳にするのは以下の3つあたりでしょうか。

DL数を見るとpyscopg2が圧倒的です。実際、利用実績も多いですし、Python2/3系ともに対応しているので使いやすいです。ただし、psycopg2はlibpqに依存していますので、postgresql-devel等パッケージが必要です。

一方で、pg8000やpy-postgresqlはPure Pythonで実装されていますので、libpqを必要としません。その点では導入コストが低いですが、pg8000Python2系のみpy-postgresqlPython3系のみをサポートしている点に注意してください。
※py-postgresqlのDL数が少ないのはPython3系のユーザ自体が現状少ないことも影響している模様です。

簡単なツール類であれば、PurePythonのドライバのほうが容易ですが、安定性等を考慮しますとpsycopg2を利用するのが安心かと思われます。

なお、余談ですが@snaga様が公開されているpostgres-toolkitの内部では、PsqlWrapper.pyという名前でpsql経由でSQLを発行しつつ、標準出力を扱いやすい形にパースして戻すライブラリを実装されています。個人的にPostgreSQLで処理をする軽量ツールを作成する場合は、このような実装を行なうことも選択肢の一つかもしれません。

Node.jsの場合

Node.jsでPostgreSQLに接続する場合はnode-postgresを使うことが多いです。こちらはPure Javascriptの実装ですので、以下でインストール可能です。

$ npm install pg

なお、node-postgresにはlibpqを利用するpg-nativeもありますが、多くの場合はpgで利用されているようです。
node-postgresでは、取得結果をJSON形式で戻しています。

[
    {
        "empno": "7369",
        "ename": "SMITH",
        "job": "CLERK",
        "mgr": "7902",
        "hiredate": "1980-12-17T00:00:00.000Z",
        "sal": "800.00",
        "comm": null,
        "deptno": "20"
    },
    {
        "empno": "7499",
        "ename": "ALLEN",
        "job": "SALESMAN",
        "mgr": "7698",
        "hiredate": "1981-02-20T00:00:00.000Z",
        "sal": "1600.00",
        "comm": "300.00",
        "deptno": "30"
    }
]

なかなか直感的な形式ですが、さらに9.1以降で追加されているJSON型やJSONB型も以下のようにしれっとJSONとして戻してくれます。

sample_db=# create table json_test(json_col json);
CREATE TABLE
sample_db=# insert into json_test values('{"A":{"B":[1,2,3]}}'::json);
INSERT 0 1
sample_db=# insert into json_test values('{"C":{"D":[4,5]}}'::json);
INSERT 0 1

[
    {
        "json_col": {
            "A": {
                "B": [
                    1,
                    2,
                    3
                ]
            }
        }
    },
    {
        "json_col": {
            "C": {
                "D": [
                    4,
                    5
                ]
            }
        }
    }
]

Node.jsというとバックエンドはMongoDBなケースも多いですが、PostgreSQLも十分にNode.js向きではないでしょうか。

.NET Frameworkの場合

Npgsqlを利用することで、.NETからもPostgreSQLに接続可能です。Nuget経由で入手できます。NpgsqlはPure C#なので、libpqを必要としません。Windows環境ではちょっとPostgreSQLの準備が面倒な時もあるので、これは嬉しいですね。

ADO.NET互換なので、他のDBでADO.NETを使用したことがあれば殆ど迷うこと無く利用できるかと思います。

ちなみに、Monoでも動かせるようですが私は試したことがありません…

PHPの場合

phpはPostgreSQL関数が用意されているため、こちらを利用することになります。なお、使用するにはphpが—with-pgsqlオプション付きでコンパイルされている必要があります。また、PDO経由で使用する場合は—with-pdo-pgsqlが必要です。libpqに依存していますので、postgresql-develなどのパッケージを別途導入する必要があります。

すでに導入されているPHPでPostgreSQL関数やPDO経由でPostgreSQLが利用できるかは、<?php phpinfo() ?>を使って確認できます。

また、php-configからコンパイルオプションを確認してもよいでしょう。

実行例
$ ./php-config --configure-options
--prefix=/home/sample/apps/php ...--with-pgsql=/home/sample/posgrehome --with-pdo-pgsql=/home/sample/posgrehome 

Rubyの場合

Rubyはruby-pgモジュールをを利用することが多いようです。こちらもlibpqを使用する実装のようですのでpostgresql-develなどのパッケージを別途導入する必要があります。

gem install pg

なお、PostgreSQLをソースからビルドしているなどで通常とは異なるディレクトリにインストールして、ruby-pgのインストール時にコケます。その場合は以下のようにpg_configへのパスを指定します。(マニュアルにも書いてあります)

gem install pg -- --with-pg-config=<path to pg_config>

さいごに

ざっくりとではありますが、PostgreSQLを各種言語から利用する場合の話をまとめさせていただきました。主要な言語にはドライバがひと通り揃っていますので、まだPostgreSQLを利用されたことのない方は一度触ってみては如何でしょうか。

PostgreSQL Advent Calendar 2015 Day5の担当はnuko_yokohama様です。

This post is the No.4 article of PostgreSQL Advent Calendar 2015