.pdfファイルをテーブルに保存する必要があります。
列を持つテーブルstate
があります。
id_state,
name,
pdffile (bytea)
Pdffile列にpdfファイルを保管したい。
これどうやってするの?
最初に、PDFをbyteaとしてDBに保存します。これらは大きなオブジェクトよりも管理が簡単で、ストリーミングAPI(今は、ビデオにストリーミングされるため、LOBに入る必要があります)をあまり活用していません。これを実行する際の1つの本当の問題は、データベースに戻ったときにデータをアンエスケープするために余分なメモリが必要であり、効果的にストリーミングできないことです。
重要なことは、データが戻ってきたときにデータのエスケープを解除する必要があるということです。 libpqは、他のプログラミング言語と同様に、そのための関数を提供します。いくつか(Perlなど)は、これらのケースを自動的に処理するdbドライバーを提供します。
これで正しい構造になりました。それをbyteaとして保存し、取得時にエスケープを解除します。
これを実現するために、ライブラリ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メーリングリストのスレッドです。
pyODBC
やpsqlODBC
のような他のAPIとそれほど変わらないものになると思います。選択したライブラリによって異なります。 どのAPIを使用しているかは言いませんでした。
ただし、データベース内のPDFファイルへのURI/URLのみを保存することも検討する必要があります。
PDFを編集または処理できるデータベース機能はありません。それらを格納すると、dbセッションが長期間ロックされる可能性があります。これを行う理由はまったくありません。 PostgreSQLはファイルシステムではなく、データベースです。
おそらく最良の方法でストアPDFファイルはラージオブジェクトを経由します。タイプOID
のテーブルフィールドが必要です。ラージオブジェクトの作成PDFを使用して、ラージオブジェクトOID
をテーブルに保存します。
大きなオブジェクト権限が定義されているため、postgresql 9に注意してください。ラージオブジェクトへのアクセスを多くの異なるpostgresqlユーザーと共有する場合は、GRANT
ユーザーにSELECT
権限を付与する必要があります。 GRANT
DELETE
権限を付与することはできないため、オブジェクトを削除する必要があるのは所有者です。
さらに、ストレージの維持には特別な注意を払う必要があります。ラージオブジェクトを削除し、テーブルからOIDを削除すると、ラージオブジェクトストレージは解放されません。次のコマンドを実行する必要があります。 vacuumlo
と呼ばれるcontribパッケージは、通常のvacuumdb
に続いて追加されます。