2012-02-16 28 views
2

私はPostgreSQL 9をアプリケーションとして使用しています。データベースには「種」のテーブル があります。 。 表Iは、データベース内の画像を保存するサーバシステム上のpostgreSQLのlo_exportに COPYを使用する

INSERT INTO species(fishes,fishesimages VALUES('01',lo_import('C://01.jpg')); 

を使用

 CREATE TABLE fishes 
       (
        fishes character varying(7) NOT NULL, 
        speciesimages oid, 
        CONSTRAINT species_pkey PRIMARY KEY (species) 
       ) 
        WITH (
         OIDS=TRUE 
       ); 

あります。私は、ホストがローカルホストあるときにこれが正常に動作しますが、それがサーバである場合、これは、サーバシステムと私には存在しないかもしれないと私はパスc://を使用することはできません

 SELECT lo_export(fishes.fishesimages,'c://outimage.jpg') 
     FROM fishes 
     WHERE fishes= '01'; 

を使用した画像を取得するための

とにかく権限はありません。

はので、私はこの

"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.101 -p 5432 -d myDB -U DB_admin -c "\COPY (SELECT lo_export(fishes.fishesimages,'01.jpg') FROM fishes WHERE species = '01') TO 'C://leeImage.jpeg' WITH BINARY"; 

よう

\ COPY

を使用しますが、このイメージファイルを作成するために着手したが、私はその無効な画像を開いたとき enter image description here

誰でもできますサーバーマシンからlo_export機能を使用してクライアントマシンにイメージを作成する方法を教えてください。

答えて

2

基本的には:

  1. lo_exportは(常に)ローカルにファイルを書き込むようにサーバに指示します
  2. \copyCOPY ... TO STDOUTコマンドにはpsqlによって形質転換されると、出力は指定したファイルに書き込まれます。 (だから何そのファイルに書かれていることはあなたが前にやっていたselectなステートメントの結果です)

だからこのようにlo_exportを使用しないで、あなたは、それは常に、サーバーの上にファイルを書き込みますすることができますファイルシステム。

もちろん、サーバーで共有ドライブに書き込みを行い、そのドライブからファイルを読み取るだけで、これを解決できます。醜い、しかし効果的なIMHO。 PSQLのいくつかの最近のバージョンについては

(これを導入した場合わからない)OIDとファイル名をとり\lo_export psqlのコマンドがあり、例えば:

\lo_export 28914648 testfile 

ファイルのOIDを取得する必要がありますが何とかスクリプトに...

あなたはbytea型としてファイルをダンプするために、このようなPL/pgSQL関数を記述することができます。

CREATE OR REPLACE FUNCTION getfiledata(lobjid oid) RETURNS bytea 
    STRICT STABLE LANGUAGE plpgsql AS $$ 
DECLARE 
    fd int4; 
    imgsize int4; 
    INV_READ int4 := 262144; 
    SEEK_SET int4 := 0; 
    SEEK_END int4 := 2; 
BEGIN 
    SELECT lo_open(lobjid, INV_READ) INTO fd; 
    PERFORM lo_lseek(fd, 0, SEEK_END); 
    SELECT lo_tell(fd) INTO imgsize; 
    PERFORM lo_lseek(fd, 0, SEEK_SET); 
    RETURN loread(fd, imgsize); 
END; 
$$; 

今すぐbytea型の値として、その内容を返します。ラージオブジェクトのOIDを持つこの関数を呼び出します。したがって、COPYコマンドでこの関数を呼び出すと、ファイルデータが返されます。\copyを使用すると、クライアントに送信されます。

この大規模オブジェクト・インタフェースではなく、bytea列を直接使用することが最近一般的に推奨されています。 PostgreSQLは大量の値を自動的に行外ストレージ( "TOASTテーブル")に移動し、圧縮モードも "external"に設定しない限り圧縮しません。これはJPEGイメージに対してはおそらく適切ですなど)

EDIT: \lo_export19135は画像私はあなたから得ることができ、クライアントシステム.. OIDにしたい種のOIDですcommandprompt.com

`"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.101 -p 5432 -d myDB -U DB_admin -c "\lo_export 19135 'C://leeImage.jpeg' ";` 

からこれを試してみてくださいfishesテーブルfishesimages OID 上記のコードでOIDを使用すると、OIDを使用して画像を取得できます。

+1

単純にSQLコマンドを 'copy(SELECT getfiledata(species.speciesimages)FROM species = 'Acaac01')のように変更します。 '' C://leeImage.jpeg 'WITH BINARY' – araqnid

+0

どこで 'CREATE OR REPLACE FUNCTION getfiledata(lobjid oid)RETURNS bytea'と書くのですか? PostgreSQLに組み込まれているのでしょうか?ああ、右: – PresleyDias

+0

;それをpsqlプロンプトに貼り付けて一度だけ実行すれば、それはセッション間で持続する1回限りの設定です。 – araqnid

関連する問題