ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

ラージオブジェクトを使ってみた サーバサイド編

DBでバイナリデータの扱う練習をかねて、PostgreSQL のラージオブジェクトで遊んでみた。

PostgreSQL 8.3.4文書
ラージオブジェクト::サーバ側の関数


Bytea型もあるけど、psql からデータ出し入れする方法が思い当たらないのでとりあえず。
ちなみにラージオブジェクトとBytea型の比較は以下のサイトで詳しく紹介されてました。
http://mikilab.doshisha.ac.jp/dia/research/report/2003/0606/001/report20030606001.html

ラージオブジェクトID格納テーブルを作成

バイナリデータはテーブルに格納される訳ではなく、別な領域に格納されるらしい。
ここではバイナリデータがどのラージオブジェクトIDに紐づいているかを知る為のテーブルを作成する。

CREATE TABLE image (
    name            text     UNIQUE,
    object_id       oid
);

バイナリデータを登録する

lo_import() を利用する。ファイルの指定は postgres 権限でアクセスできるディレクトリ配下に無いとダメ。

postgres=# INSERT INTO image (name, object_id)
    VALUES ('test image', lo_import('/tmp/vipper.jpg'));

INSERT 0 1

postgres=# select * from image;
    name    | object_id 
------------+-----------
 test image |     16427
(1 row)

バイナリデータを取得する

lo_export() を利用する。
引き出すラージオブジェクトIDとファイルパス/ファイル名を引数とする。
出力先は postgres 権限でアクセスできるディレクトリ配下に無いとダメ。

postgres=# SELECT lo_export(image.object_id, '/tmp/vipper_export.jpg') FROM image
 WHERE name = 'test image';

 lo_export 
-----------
         1
(1 row)

格納したバイナリファイルを削除する

lo_unlink() を利用する。
ラージオブジェクトを削除しても、ID格納テーブルには情報が残ってしまうので合わせて削除する。

postgres=# SELECT lo_unlink(object_id) FROM image WHERE name = 'test image';
 lo_unlink 
-----------
         1
(1 row)

postgres=# DELETE FROM image WHERE name = 'test image';

コレは一本化する必要が…


雑感

たしかにバイナリファイルを扱えましたが…
Mac & Windows & Linux でごちゃごちゃやるのに、入出力用のクライアントが無いと使ってられない機能。