2009-07-03 21 views
10

Ich mache ein Modell, in dem ich eine FileField habe. Ich möchte den Dateiinhalt in einer Datenbankspalte anstelle des Dateipfads speichern. Irgendwelche Vorschläge?Dateiinhalt in DB speichern

+1

Warum möchten Sie das tun? Dateien gehören zum Dateisystem. –

+0

Wie viel binäre Daten möchten Sie in der Datenbank speichern? Es besteht ein großer Unterschied zwischen dem Speichern einiger Binärobjekte in der Datenbank im Vergleich zum Speichern Tausender großer Binärdateien. – Kane

+0

Ja. Was ist der Grund für diese Entscheidung? Warum nicht auf dem FS speichern? – exhuma

Antwort

-2

es ist sehr einfach

nur

Speichermethode in Admin overide
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() 

diese speichert filecontent in db Spalte filecontent der Tabelle filecontent

+0

Dies wird nicht funktionieren. Die erste Binärdatei, die Sie mit Nicht-ASCII-Zeichen speichern möchten, wird in die Luft gehen. Sie müssen es zuerst mit base64 codieren und dann dekodieren, wenn Sie es aus der Datenbank lesen. – Cerin

1

Nun, wie wäre es mit der Speicherung in einer binären Spalte? Sie können dann die Sammlung von Bytes speichern. Und wenn der Dateiname auch für Sie wichtig ist, können Sie diesen in einer zusätzlichen Namensspalte speichern.

21

Die Neinsager ignorieren. Wenn Sie die volle Kontrolle über Ihren Inhalt haben möchten, legen Sie die Dateien in ein Blob-Feld in der Datenbank. Ich halte den Dateinamen im Allgemeinen auch in einem separaten Feld, sodass ich die Datei nach Bedarf rekonstruieren kann (auf diese Weise behalten Sie die Erweiterung bei, die sie in den meisten Betriebssystemen mit einem Dateityp verknüpft).

Stellen Sie sicher, dass Sie die tatsächlichen Blobdaten in einer separaten Tabelle speichern, die nur über eine ID mit Ihrer Dateinamen-/Zusatzinfo-Tabelle verbunden ist. Auf diese Weise opfern Sie keine Leistung im Umgang mit Informationen in Bezug auf die Datei anders als der Inhalt selbst.

Was die Neinsager nicht erkennen, ist, dass Datenbanken einfach eine extrem optimierte Form des Dateisystems sind. Bytes sind Bytes und Disc-Sektoren sind Disc-Sektoren. Datenbanken sind einfach viel besser beim Organisieren und Durchsuchen dieser Bytes als bei Dateisystemen. Ganz zu schweigen davon, dass Datenbanken viel strengere Sicherheitsanforderungen als die meisten Dateisysteme erfüllen und besser gewartet werden (mit Backups, Support-Mitarbeitern usw.).

+0

Ich möchte nur den Dateiinhalt in der db-Spalte einer Tabelle speichern, die nicht daran interessiert ist, eine Tabelle dafür zu verschwenden. Ich kann den Dateiinhalt wieder in demselben Patern wiederherstellen. – ha22109

+0

Vielen Dank für einen kleinen Realitätscheck. Ich habe immer gespürt, dass Djangos Standardabneigung gegen das Speichern von Dateien in der Datenbank zu einfach ist. Selbst wenn Sie sie aus der Datenbank bereitstellen möchten, können Sie Ihr Modell immer mit einer Cache-Schicht umhüllen, um das Beste aus beiden Welten zu erhalten. – Cerin

9

Ich weiß, dass dies eine alte Frage, aber es gibt Seither wurde ein guter Code geschrieben, um diese Option zu ermöglichen. Siehe speziell django-database-files, die Djangos Speicher-API verwenden wird, damit alle FileFields und ImageFields ihren Inhalt in der Datenbank speichern. Es gibt auch eine fork, um die Dateien lokal im Dateisystem zwischenzuspeichern, um den größten Nachteil der Datenbank zu überwinden, nämlich die Latenz.