web-dev-qa-db-ja.com

PostgreSQLにPDFを保存する方法

.pdfファイルをテーブルに保存する必要があります。

列を持つテーブルstateがあります。

id_state,
name,
pdffile (bytea)

Pdffile列にpdfファイルを保管したい。

これどうやってするの?

6
Giuliocas

最初に、PDFをbyteaとしてDBに保存します。これらは大きなオブジェクトよりも管理が簡単で、ストリーミングAPI(今は、ビデオにストリーミングされるため、LOBに入る必要があります)をあまり活用していません。これを実行する際の1つの本当の問題は、データベースに戻ったときにデータをアンエスケープするために余分なメモリが必要であり、効果的にストリーミングできないことです。

重要なことは、データが戻ってきたときにデータのエスケープを解除する必要があるということです。 libpqは、他のプログラミング言語と同様に、そのための関数を提供します。いくつか(Perlなど)は、これらのケースを自動的に処理するdbドライバーを提供します。

これで正しい構造になりました。それをbyteaとして保存し、取得時にエスケープを解除します。

3
Chris Travers

これを実現するために、ライブラリlipqを使用しました。これはpostgresqlのC APIです。

const char *paramValues[2];
paramValues[0] = &your_id;
paramValues[1] = &binaryContentOfPdfFile;

res = PQexecParams(pConnection, "insert into my_table (id_state, pdffile)
VALUES ($1, $2);",
        2,       /* params */
        NULL,    /* let the backend deduce param type */
        paramValues,
        NULL,    /* don't need param lengths since text */
        NULL,    /* default to all text params */
        0);

これは私がコードを取得したpostgresqlメーリングリストのスレッドです。

pyODBCpsqlODBCのような他のAPIとそれほど変わらないものになると思います。選択したライブラリによって異なります。 どのAPIを使用しているかは言いませんでした

ただし、データベース内のPDFファイルへのURI/URLのみを保存することも検討する必要があります。

2

PDFをデータベースに保存しない

PDFを編集または処理できるデータベース機能はありません。それらを格納すると、dbセッションが長期間ロックされる可能性があります。これを行う理由はまったくありません。 PostgreSQLはファイルシステムではなく、データベースです。

1
Evan Carroll

おそらく最良の方法でストアPDFファイルはラージオブジェクトを経由します。タイプOIDのテーブルフィールドが必要です。ラージオブジェクトの作成PDFを使用して、ラージオブジェクトOIDをテーブルに保存します。

大きなオブジェクト権限が定義されているため、postgresql 9に注意してください。ラージオブジェクトへのアクセスを多くの異なるpostgresqlユーザーと共有する場合は、GRANTユーザーにSELECT権限を付与する必要があります。 GRANTDELETE権限を付与することはできないため、オブジェクトを削除する必要があるのは所有者です。

さらに、ストレージの維持には特別な注意を払う必要があります。ラージオブジェクトを削除し、テーブルからOIDを削除すると、ラージオブジェクトストレージは解放されません。次のコマンドを実行する必要があります。 vacuumloと呼ばれるcontribパッケージは、通常のvacuumdbに続いて追加されます。

1
eppesuig