Hatena::ブログ(Diary)

ふぁいんでぃんぐねもの日記 このページをアンテナに追加 RSSフィード

2009-02-21

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

ため込んだH動画&H画像を奥様に見つからないようにげ、げふん。

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 でごちゃごちゃやるのに、入出力用のクライアントが無いと使ってられない機能。

ファイルの管理はファイルシステムに任せるべきですね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yamazaru_rengou/20090221/1235230805