2009-07-03 3 views
10

나는 FileField 인 모델을 만들고 있습니다. 파일 경로가 아닌 데이터베이스 열에 파일 내용을 저장하려고합니다. 어떤 제안?DB에 파일 내용 저장

+1

왜 그렇게하고 싶습니까? 파일은 파일 시스템에 속합니다. –

+0

얼마나 많은 바이너리 데이터를 데이터베이스에 저장할 것으로 예상합니까? 수천 개의 큰 바이너리 파일을 저장하는 것과 비교할 때 데이터베이스에 몇 개의 바이너리 개체를 저장하는 것과 큰 차이가 있습니다. – Kane

+0

예. 그 결정의 근거는 무엇입니까? 왜 그들을 FS에 보관하지 않습니까? – exhuma

답변

-2

그냥이 테이블 포함한 FileContent의 DB를 열 포함한 FileContent에 포함한 FileContent 저장합니다 관리자

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

에 저장 방법 오버라이드 (override)하는 것은 매우 쉽습니다

+0

이것은 작동하지 않습니다. 비 ASCII 문자로 저장하려고하는 첫 번째 이진 파일은 파일을 날려 버립니다. 먼저 base64를 사용하여 인코딩 한 다음 데이터베이스에서 읽을 때 디코딩해야합니다. – Cerin

1

글쎄, 단순히 이진 열에 저장하는 것은 어떻습니까? 그런 다음 바이트 콜렉션을 저장할 수 있습니다. 파일 이름이 중요한 경우 추가 이름 열에 저장할 수 있습니다.

21

naysayers를 무시하십시오. 컨텐츠를 완전히 제어하려면 파일을 데이터베이스의 blob 필드에 넣으십시오. 필자는 일반적으로 별도의 필드에 파일 이름을 유지하므로 필요에 따라 파일을 재구성 할 수 있습니다 (대부분의 운영 체제에서 파일 형식에 연결하는 확장명을 유지하는 방식으로).

실제 BLOB 데이터를 별도의 테이블에 저장하십시오. 파일 관련 정보를 처리 할 때 성능을 희생하지 않는 방식으로 ID를 통해 파일 이름/추가 정보 테이블에만 연결됩니다. 콘텐츠 자체가 아닌

naysayers가 인식하지 못한 것은 데이터베이스가 단순히 파일 시스템의 매우 최적화 된 형태라는 것입니다. 바이트는 바이트이고 디스크 섹터는 디스크 섹터입니다. 데이터베이스는 파일 시스템보다 이러한 바이트를 구성하고 검색하는 것이 훨씬 낫습니다. 물론 데이터베이스는 대부분의 파일 시스템보다 훨씬 엄격한 보안을 구현하며 더 잘 유지 관리됩니다 (백업, 지원 직원 등).

+0

나는 단지 테이블의 DB 컬럼에 filecontent를 저장하고 싶다. 테이블의 낭비에 관심이 없다. 같은 patern에서 파일 내용을 다시 얻을 수있다. – ha22109

+0

약간의 현실 확인을 해주셔서 감사합니다. 나는 항상 데이터베이스에 파일을 저장하는 Django의 기본 혐오감이 지나치게 단순하다고 느꼈다. 데이터베이스에서 이들을 제공하려는 경우에도 캐싱 계층으로 모델을 래핑하여 두 가지 장점을 최대한 활용할 수 있습니다. – Cerin

9

나는이 오래된 질문 알지만, 거기에 그 이후로이 옵션을 허용하는 좋은 코드를 써야합니다. 특히 django-database-files을 참조하십시오. Django의 저장소 API를 사용하여 모든 FileField 및 ImageField가 해당 내용을 데이터베이스에 저장합니다. 파일 시스템에 로컬로 파일을 캐시하여 대기 시간 인 데이터베이스 사용의 가장 큰 경고를 극복 할 수있는 fork도 있습니다.