2009-07-03 10 views
10

Je fais un modèle dans lequel j'ai un FileField. Je veux stocker le contenu du fichier dans une colonne de base de données, au lieu du chemin du fichier. Aucune suggestion?Stocker le contenu du fichier dans DB

+1

Pourquoi voulez-vous faire cela? Les fichiers appartiennent au système de fichiers. –

+0

Combien de données binaires pensez-vous stocker dans la base de données? Il y a une grande différence entre le stockage de quelques objets binaires dans la base de données et le stockage de milliers de gros fichiers binaires. – Kane

+0

Oui. Quelle est la raison d'être de cette décision? Pourquoi ne pas les stocker sur le FS? – exhuma

Répondre

-2

il est très facile

juste OVERIDE méthode de sauvegarde dans l'admin

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

ce stockera ContenuFichier dans la colonne db ContenuFichier de la table ContenuFichier

+0

Cela ne fonctionnera pas. Le premier fichier binaire que vous essayez d'enregistrer avec des caractères non-ASCII le fera exploser. Vous devez d'abord l'encoder en utilisant base64, puis le décoder en le lisant hors de la base de données. – Cerin

1

Eh bien, que diriez-vous simplement de le stocker dans une colonne binaire? Vous pouvez ensuite stocker la collection d'octets. Et si le nom de fichier est important pour vous aussi, vous pouvez le stocker dans une colonne de nom supplémentaire.

21

Ne tenez pas compte des détracteurs. Si vous voulez avoir un contrôle total sur votre contenu, placez les fichiers dans un champ blob dans la base de données. En général, je garde également le nom de fichier dans un champ séparé, afin que je puisse reconstruire le fichier si nécessaire (de cette façon, vous gardez l'extension, ce qui le lie à un type de fichier dans la plupart des systèmes d'exploitation). Assurez-vous de stocker les données BLOB réelles dans un tableau séparé, uniquement connecté à votre nom de fichier/table d'information supplémentaire via un ID ... De cette façon, vous ne sacrifiez pas les performances lorsque vous manipulez des informations relatives au fichier autre que le contenu lui-même.

Ce que les opposants échouent à réaliser, c'est que les bases de données sont simplement une forme extrêmement optimisée de système de fichiers. Les octets sont des octets et les secteurs de disque sont des secteurs de disque. Les bases de données sont simplement beaucoup mieux à organiser et à chercher ces octets que les systèmes de fichiers. Sans oublier que les bases de données implémentent une sécurité beaucoup plus stricte que la plupart des systèmes de fichiers et sont mieux maintenues (avec des sauvegardes, du personnel de support etc.).

+0

je veux seulement stocker le contenu de fil dans la colonne de DB d'une table, pas intéressé à gaspiller la table pour cela. Je peux regagner le contenu de dossier encore dans le même patern. – ha22109

+0

Merci pour un peu de vérification de la réalité. J'ai toujours senti que l'aversion par défaut de Django pour stocker des fichiers dans la base de données est trop simpliste. Même si vous voulez les servir à partir de la base de données, vous pouvez toujours envelopper votre modèle avec une couche de mise en cache, pour avoir le meilleur des deux mondes. – Cerin

9

Je sais que c'est une vieille question, mais il y a été un bon code écrit depuis lors pour permettre cette option. Spécialement, voir django-database-files, qui utilisera l'API de stockage de Django pour que tous les fichiers FileFields et ImageFields stockent leur contenu dans la base de données. Il y a également un fork pour mettre en cache les fichiers localement sur le système de fichiers, afin de surmonter le plus gros problème d'utilisation de la base de données, qui est la latence.

Questions connexes