4

byteaアップロードした画像をPostgreSQL データベースの列に保存したい。byteaRailsから画像を列に保存する方法について、できれば例を挙げてアドバイスを探しています。

Rails 3.1 と "pg" ドライバーを使用して PostgreSQL に接続しています。

4

1 に答える 1

9

多くの場合、画像をデータベース自体に保存することはお勧めできません

is it better to store images in a BLOB or just the URL?のディスカッションを参照してください。およびファイル - データベースにあるかどうか . これらの質問とその回答は、特に PostgreSQL に関するものではないことに注意してください。

これには PostgreSQL 固有の問題がいくつかあります。PostgreSQL には増分ダンプ*の機能がないため、バックアップを使用している場合は、pg_dumpバックアップごとにすべてのイメージ データをダンプする必要があります。特に、最新の単一のバックアップだけでなく、数週間分のバックアップを保持する必要があるため、ストレージ容量と転送時間が問題になる可能性があります。

イメージが大きい場合や多数の場合は、ACID 準拠のトランザクション アクセスが強く必要でない限り、イメージをファイル システムに保存することを検討してください。ファイル名をデータベースに保存するか、便利なキーに基づいてファイル命名規則を確立します。そうすれば、画像ディレクトリの簡単な増分バックアップを実行して、適切なデータベースとは別に管理できます。

イメージを FS に保存すると、PostgreSQL データベース接続を介してイメージに簡単にアクセスすることはできません†</sup>。OTOHを使用すると、最初に DB からクエリを実行する必要がある場合よりもはるかに効率的に、ファイル システムから直接 HTTP 経由でそれらを提供できます。特に、イメージが FS 上にあるがデータベースからではない場合、Rails から sendfile() を使用できます。

本当にDBに画像を保存する必要がある場合

... 概念的には .NET と同じですが、正確な詳細は、指定していない、使用している Pg ドライバーによって異なります。

それには 2 つの方法があります。

  • byteaあなたが尋ねたように、保存して取得します。と
  • 組み込みのラージ オブジェクト サポートを使用しbyteaます。

byteaがOKな小さな画像の場合:

  • クライアントから画像データをローカル変数に読み込む
  • 変数を bytea として渡して、DB に挿入します。ドライバーを使用していると仮定すると、ruby-pgドライバーのtest_binary_valuesの例が役立ちます。

より大きな画像 (数メガバイト以上) の場合は、lo代わりに次を使用します。

大きな画像の場合は使用しないでくださいbytea。理論上の最大値は 2GB かもしれませんが、実際には、画像サイズが示唆するように 3 倍 (またはそれ以上) の RAM が必要になるbyteaため、大きな画像やその他の大きなバイナリ データには使用しないでください。

PostgreSQL には専用のlo(ラージ オブジェクト) タイプがあります。9.1 の場合:

CREATE EXTENSION lo;
CREATE TABLE some_images(id serial primary key, lo image_data not null);

... 次にlo_import、ディスク上の一時ファイルからデータを読み取るために使用するため、すべてを一度に RAM に収める必要はありません。

ドライバは、、 などのラッパー呼び出しruby-pg提供し、ローカル ファイル アクセス用の も提供します。この便利な例を参照してください。lo_createlo_openlo_import

ではなく大きなオブジェクトを使用してくださいbytea


*ストリーミング レプリケーション、PITR / WAL アーカイブなどで増分バックアップが可能ですが、やはり DB サイズを増やすと WAL 管理などが複雑になる可能性があります。とにかく、あなたが専門家 (または「勇敢」) でない限り、pg_dumpレプリケーションと PITR だけに頼るのではなく、バックアップを取るべきです。DB にイメージを配置すると、DB のサイズが大きくなるため、速度が大幅に低下しpg_basebackupます。これは、フェイルオーバー シナリオで重要になる可能性があります。

†</sup> adminpackは、スーパーユーザーに Pg 接続を介したローカル ファイル アクセスを提供します。ただし、 webapp ユーザーは、スーパーユーザー権限や、それが動作するテーブルの所有権さえも持つべきではありません。のような別の安全なチャネルを介してファイルの読み取りと書き込みを行いますWebDAV

于 2012-08-13T06:48:09.187 に答える