ラージオブジェクトを使ってみた サーバサイド編
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';
コレは一本化する必要が…