2009-07-03 173 views
10

Estoy haciendo un modelo en el que tengo un FileField. Quiero almacenar el contenido del archivo en una columna de base de datos, en lugar de la ruta del archivo. ¿Alguna sugerencia?Almacenamiento de contenido de archivos en DB

+1

¿Por qué quieres hacer eso? Los archivos pertenecen al sistema de archivos. –

+0

¿Cuántos datos binarios espera almacenar en la base de datos? Existe una gran diferencia entre almacenar algunos objetos binarios en la base de datos en comparación con almacenar miles de archivos binarios grandes. – Kane

+0

Sí. ¿Cuál es el fundamento de esa decisión? ¿Por qué no almacenarlos en el FS? – exhuma

Respuesta

-2

es muy fácil

simplemente overide método para guardar en el administrador

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

este almacenará fileContent en dB columna fileContent de fileContent mesa

+0

Esto no funcionará. El primer archivo binario que intente guardar con caracteres que no sean ASCII lo explotará. Primero debe codificarlo utilizando base64 y luego decodificarlo cuando lo lea fuera de la base de datos. – Cerin

1

Bueno, ¿qué tal si simplemente lo almacenamos en una columna binaria? A continuación, puede almacenar la colección de bytes. Y si el nombre del archivo también es importante para usted, puede almacenarlo en una columna de nombre adicional.

21

Ignore los que menos. Si desea tener control total sobre su contenido, coloque los archivos en un campo blob en la base de datos. En general, también guardo el nombre del archivo en un campo separado, por lo que puedo reconstruir el archivo según sea necesario (de esa manera conservas la extensión, lo que la vincula a un tipo de archivo en la mayoría de los sistemas operativos).

Asegúrese de almacenar los datos de blobs reales en una tabla separada, solo conectada a su nombre de archivo/tabla de información adicional mediante una identificación ... de esa manera no sacrificará ningún rendimiento al tratar con cualquier información relacionada con el archivo que no sea el contenido en sí.

Lo que los detractores no se dan cuenta es que las bases de datos son simplemente una forma extremadamente optimizada de sistema de archivos. Los bytes son bytes y los sectores de disco son sectores de disco. Las bases de datos son mucho mejores para organizar y buscar esos bytes que los sistemas de archivos. Sin mencionar que las bases de datos implementan una seguridad mucho más estricta que la mayoría de los sistemas de archivos y se mantienen mejor (con copias de seguridad, personal de soporte, etc.).

+0

solo quiero almacenar el contenido del archivo en la columna db de una tabla, no estoy interesado en perder la tabla por él. Puedo recuperar el contenido del archivo de nuevo en el mismo patrón. – ha22109

+0

Gracias por un pequeño control de la realidad. Siempre he sentido que la aversión predeterminada de Django a almacenar archivos en la base de datos es demasiado simplista. Incluso si desea servirlos desde la base de datos, siempre puede envolver su modelo con una capa de almacenamiento en caché, para tener lo mejor de ambos mundos. – Cerin

9

Sé que esto es una cuestión de edad, pero no hay Ha sido un buen código escrito desde entonces para permitir esta opción. Especialmente, vea django-database-files, que usará la API de almacenamiento de Django para hacer que todos FileFields e ImageFields almacenen sus contenidos en la base de datos. También hay un fork para almacenar en caché los archivos localmente en el sistema de archivos, para superar la mayor advertencia sobre el uso de la base de datos, que es la latencia.

Cuestiones relacionadas