2009-07-03 132 views
10

我正在製作一個模型,其中我有一個FileField。我想將文件內容存儲在數據庫列中,而不是文件路徑。有什麼建議麼?在DB中存儲文件內容

+1

你爲什麼想這樣做?文件屬於文件系統。 – 2009-07-03 12:39:10

+0

您希望在數據庫中存儲多少二進制數據?與存儲數千個大型二進制文件相比,在數據庫中存儲少量二進制對象有很大的區別。 – Kane 2009-07-04 04:23:05

+0

是的。這個決定的基本原理是什麼?爲什麼不把它們存儲在FS上? – exhuma 2009-09-03 09:20:11

回答

-2

這是很容易

只是在此改變保存方法在管理

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() 

這將filecontent存儲在表filecontent的數據庫列filecontent

1

那麼,簡單地將它存儲在二進制列中呢?然後您可以存儲字節的集合。如果文件名對您也很重要,您可以將其存儲在其他名稱列中。

21

無視反對者。如果您想完全控制您的內容,請將這些文件放在數據庫的blob字段中。我通常也將文件名保存在一個單獨的字段中,這樣我就可以根據需要重新構建文件(這樣您就可以保留擴展名,這在大多數操作系統中將其與文件類型綁定)。

確保將實際的斑點數據存儲在一個單獨的表格中,只通過一個ID連接到您的文件名/額外信息表...這樣,當處理與文件相關的任何信息時,不會犧牲任何性能除了內容本身。

反對者沒有意識到的是,數據庫只是一個非常優化的文件系統形式。字節是字節,磁盤扇區是磁盤扇區。數據庫在組織和搜索這些字節方面比文件系統要好得多。更不用說,數據庫實現比大多數文件系統更嚴格的安全性,並且更好地維護(備份,支持人員等)。

9

我知道這是一個老問題,但有從那時起寫了一些很好的代碼來允許這個選項。特別地,請參閱django-database-files,它將使用Django的存儲API使所有FileField和ImageFields將其內容存儲在數據庫中。還有一個fork在文件系統本地緩存文件,以克服使用數據庫的最大警告,即延遲。