DB

2009-07-03 44 views
10

Dosya içeriğinin depolanması FileField ürününe sahip olduğum bir model yapıyorum. Dosya içeriğini dosya yolu yerine bir veritabanı sütununda saklamak istiyorum. Baska öneri?DB

+1

Bunu neden yapmak istiyorsunuz? Dosyalar dosya sistemine aittir. –

+0

Veritabanında saklamak için ne kadar ikili veri beklersiniz? Binlerce büyük ikili dosyayı saklamakla karşılaştırıldığında veritabanındaki birkaç ikili nesnenin saklanması arasında büyük bir fark vardır. – Kane

+0

Evet. Bu kararın gerekçesi nedir? Neden onları FS'de saklamıyorsunuz? – exhuma

cevap

-2

o

sadece bu tablo fileContent ait db sütun fileContent içinde fileContent saklayacak yönetici

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

yılında kaydetme yöntemi overide çok kolaydır

+0

Bu işe yaramaz. ASCII olmayan karakterlerle kaydetmeye çalıştığınız ilk ikili dosya bunu patlatacaktır. Önce base64 kullanarak kodlamanız ve sonra onu veritabanından okurken çözmeniz gerekir. – Cerin

1

Peki, basitçe bir İkili sütununda depolamaya ne dersiniz? Daha sonra bayt koleksiyonunu saklayabilirsiniz. Dosya adı da sizin için önemliyse, bunu ek bir ad sütununda saklayabilirsiniz.

21

İstemcileri dikkate almayın. İçeriğiniz üzerinde tam kontrol sahibi olmak istiyorsanız, dosyaları veritabanındaki blob alanına koyun. Genelde dosya ismini de ayrı bir alanda tutuyorum, bu yüzden dosyayı gerektiği gibi yeniden yapılandırabilirim (bu sayede uzantıyı, çoğu işletim sistemindeki bir dosya tipine bağlayan uzantıyı koruyabilirsiniz).

Gerçek blob verilerini ayrı bir tabloya kaydettiğinizden, yalnızca dosya adınız/ekstra bilgi tablonuza bir kimlik aracılığıyla depolandığından emin olun ... böylece dosyayla ilgili herhangi bir bilgiyi ele aldığınızda performanstan ödün vermezsiniz içeriğin kendisi dışında.

Nişancıların fark etmediği şey, veri tabanlarının basitçe, son derece optimize edilmiş bir dosya sistemi biçimidir. Baytlar bayttır ve disk sektörleri disk sektörüdür. Veritabanları, dosya sistemlerine göre bu baytları organize etmede ve aramada çok daha iyidir. Belirtmek gerekirse, veritabanları çoğu dosya sisteminden çok daha sıkı güvenlik uygular ve daha iyi korunur (yedekleme, destek personeli vb.).

+0

Sadece dosya içeriğini bir tabloyu db sütununda saklamak istiyorum, bunun için tablo israfıyla ilgilenmiyorum. Aynı içeriğe tekrar dosya içeriğini yeniden kazanabilirim. – ha22109

+0

Küçük bir gerçeklik kontrolü için teşekkür ederiz. Ben her zaman Django'nun veritabanındaki dosyaları depolamaya yönelik varsayılan isteksizliğinin aşırı derecede basit olduğunu hissettim. Onları veritabanından sunmak isteseniz bile, modelinizi her iki dünyanın en iyisine sahip olmak için her zaman bir önbellek katmanı ile sarabilirsiniz. – Cerin

9

Bu eski bir soru olduğunu biliyorum ama orada Bu seçeneğe izin vermek için o zamandan beri yazılmış iyi bir kod oldu. Özel olarak, tüm FileFields ve ImageFields öğelerinin içeriğini veritabanında saklamak için Django'nun depolama API'sini kullanacak olan django-database-files'a bakın. Ayrıca, veritabanını kullanmanın en büyük uyarısının üstesinden gelmek için dosya sisteminde yerel olarak dosyaları önbelleğe almak için bir fork vardır.