2009-07-03 13 views
10

私はFileFieldのモデルを作っています。私はファイルのパスの代わりに、データベースの列にファイルの内容を格納する。助言がありますか?ファイルの内容をDBに保存する

+1

なぜそれをしたいですか?ファイルはファイルシステムに属します。 –

+0

データベースに保存するバイナリデータの量はどれくらいですか?何千もの大きなバイナリファイルを格納するのと比べて、データベースにいくつかのバイナリオブジェクトを格納することには大きな違いがあります。 – Kane

+0

はい。その決定の根拠は何ですか?なぜそれらをFSに保管しないのですか? – exhuma

答えて

-2

それだけで、これは私がこれは古い質問ですけど、ありますテーブル含むFileContent

+0

これは動作しません。非ASCII文字で保存しようとする最初のバイナリファイルは、それを爆破します。 base64を使用して最初にエンコードし、データベースから読み出すときにデコードする必要があります。 – Cerin

1

さて、バイナリ列に保存するのはどうですか?その後、バイトのコレクションを格納できます。また、ファイル名が重要な場合は、追加の名前列に保存することもできます。

21

naysayersは無視してください。コンテンツを完全に制御したい場合は、ファイルをデータベースのblobフィールドに入れます。私は一般に別のフィールドにファイル名を保持するので、必要に応じてファイルを再構築することができます(ほとんどのオペレーティングシステムでファイルタイプに結びつけています)。

実際のBLOBデータは別のテーブルに保存してください。ファイルに関する情報を扱う際にパフォーマンスを犠牲にすることはありませんコンテンツそのもの以外の

naysayersが実現しないことは、データベースが単にファイルシステムの非常に最適化された形式であることです。バイトはバイトで、ディスクセクタはディスクセクタです。データベースは、ファイルシステムよりもバイトを整理して検索するほうがはるかに優れています。言うまでもなく、データベースは、ほとんどのファイルシステムよりもはるかに厳格なセキュリティを実装し、(バックアップ、サポートスタッフなどで)よりよく管理されています。

+0

私はテーブルのdbカラムにfilecontentを保存したいだけで、テーブルを無駄にすることには関心がありません。同じpaternでファイルの内容を再び取り戻すことができます。 – ha22109

+0

少しの現実の確認ありがとうございました。私はいつもDjangoのデフォルトのデータベースへのファイル保存に対する嫌悪感は過度に単純だと感じていました。データベースからそれらを提供したい場合でも、キャッシングレイヤーを使用してモデルをラップして、両方の世界を最大限に活用することができます。 – Cerin

9

のデシベル欄含むFileContentに含むFileContent格納する管理方法保存

filecontent=form.cleaned_data.get('upload_file') 
data =filecontent.read() 
from django.db import connection 
cursor = connection.cursor() 
cursor.execute("update filecontent set filecontent=(%s) where id=(%s)",[data,obj.id]) 
connection.connection.commit() 
cursor.close() 
connection.close() 

をオーバライド

非常に簡単です。それ以来、このオプションを許可するために書かれた良いコードでした。特にdjango-database-filesを参照してください。これは、DjangoのストレージAPIを使用して、すべてのFileFieldとImageFieldがその内容をデータベースに格納するようにします。ファイルシステムのローカルにファイルをキャッシュするforkもあり、データベースを使用する際の最大の注意点であるレイテンシを克服しています。

関連する問題