Вопрос по django-forms, django-admin, django – Хранение содержимого файла в БД

11

Я делаю модель, в которой у меня естьFileField, Я хочу хранить содержимое файла в столбце базы данных, а не в пути к файлу. Какие-либо предложения?

Почему ты хочешь это сделать? Файлы принадлежат файловой системе. Daniel Roseman
Сколько двоичных данных вы ожидаете сохранить в базе данных? Существует большая разница между хранением нескольких двоичных объектов в базе данных по сравнению с хранением тысяч больших двоичных файлов. Kane
Да. Каково обоснование этого решения? Почему бы не хранить их на ФС? exhuma

Ваш Ответ

4   ответа
1

Ну, а как насчет просто хранить его в двоичном столбце? Затем вы можете хранить коллекцию байтов. И если имя файла также важно для вас, вы можете сохранить его в дополнительном столбце имени.

22

Не обращайте внимания на скептиков. Если вы хотите иметь полный контроль над своим содержимым, поместите файлы в поле BLOB-объектов в базе данных. Обычно я также храню имя файла в отдельном поле, чтобы при необходимости можно было восстановить файл (таким образом вы сохраняете расширение, которое связывает его с типом файла в большинстве операционных систем).

Обязательно сохраняйте фактические данные большого двоичного объекта в отдельной таблице, только связанной с вашим именем файла / таблицей дополнительной информации через идентификатор ... таким образом, вы не жертвуете какой-либо производительностью при работе с любой информацией, связанной с файлом, кроме содержимого сам.

Что скептики не понимают, так это то, что базы данных - это просто чрезвычайно оптимизированная форма файловой системы. Байты - это байты, а секторы диска - это сектора диска. Базы данных просто намного лучше организовывают и ищут эти байты, чем файловые системы. Не говоря уже о том, что базы данных обеспечивают гораздо более строгую защиту, чем большинство файловых систем, и лучше обслуживаются (с резервными копиями, службой поддержки и т. Д.).

я только хочу сохранить содержимое файла в столбце db таблицы, не заинтересовавшись потерей таблицы для него. Я могу восстановить содержимое файла снова в том же шаблоне. ha22109
Спасибо за небольшую проверку реальности. Я всегда чувствовал, что отвращение Django по умолчанию к хранению файлов в базе данных слишком упрощено. Даже если вы хотите обслуживать их из базы данных, вы всегда можете обернуть свою модель слоем кэширования, чтобы получить лучшее из обоих миров.
-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()

это будет хранить содержимое файла в столбце базы данных

Это не сработает. Первый двоичный файл, который вы пытаетесь сохранить с не-ASCII-символами, взорвет его. Вам необходимо сначала закодировать его с помощью base64, а затем декодировать при чтении из базы данных.
9

Я знаю, что это старый вопрос, но с тех пор был написан хороший код, позволяющий использовать эту опцию. Специально, посмотриДжанго-база-файлы, который будет использовать API хранилища Django, чтобы все FileFields и ImageFields сохраняли свое содержимое в базе данных. Есть такжевилка локально кэшировать файлы в файловой системе, чтобы преодолеть самый большой недостаток использования базы данных, а именно задержку.

Похожие вопросы