본문 바로가기
IT/DB

MongoDB - 이미지 파일 같은 바이너리 데이터 입력하기

요거요거 DB 에 바이너리 데이터를 입력해 둬야 한다.

머 FTP를 이용해서 파일은 따로하고, DB에는 Meta 데이터만 넣고 처리할 수 있으나 한번에 되는게 효율적이긴 하고

사용자도 더 편리할 듯~~~~

 

다행히 MongoDB 를 쓰기 위해 사용준인 MongoEngine에는 FileField 라는 것이 정의되어 있다.

간단하게 사용할 수 있는 예제를 아래 페이지에서 찾아 낼 수 있었다.

 

https://www.tutorialspoint.com/mongoengine/mongoengine_gridfs.htm
 

MongoEngine - GridFS - Tutorialspoint

MongoEngine - GridFS In MongoDB, the files with size larger than 16 MB are stored using GridFS specifications. A file is divided into multiple chunks each with a default size of 255KB. Large chunk may be as large as necessary. GridFS uses two collections,

www.tutorialspoint.com

 

Collection 선언

파일 내용이 들어갈 필드를 FileField 로 정의하면 된다. 아래 예제의 logo 부분이다.

class lang (Document):
   name=StringField()
   developer=StringField()
   logo=FileField()

 

파일 내용 추가하기

실제 파일 내용을 FileField에 추가하려면 아래 처럼 코드를 쓰면 된다. 머 put() 해주면 된다로 정리가 되겠네

간단하게 설명하면 파일을 열고 내용을 f 라는 변수에 저장해 두고,

logo.put() 을 이용해서 f 값을 DB 에 넣어준다.

당연히 save() 해야지.

l1=lang()
l1.name='Python'
l1.developer='Van Rossum'
f=open('pylogo.png','rb')
l1.logo.put(f,content_type='image/png')
l1.save()

 

MongoDB 확인하기

실제 예제를 수행해봐도, 내가 하고 있는 프로젝트의 DB내용을 확인해 봐도

logo 라고 FileField 로 선언한 부분에는 그냥 ObjectId 하나가 할당되어 있는게 다였다.

머지, 어데로 갔나 찾아보자.

요상한 컬렉션이 자동으로 생겨져 있네 의심해보자 :)

MongoDB 파일 저장 컬렉션

fs.chunks 에 실제 파일 데이터가 들어 있고

fs.chunks 컬렉션 내용

fs.files 에는 들어가 있는 파일들의 기본 정보가 들어 있더라는 말씀.

fs.files 컬렉션 내용

아무튼 내가 올린 파일이 잘 저장되어 있다는 거 확인. 

 

파일 읽기

이제 그럼 읽어보자. 어떻게 해야 하나?

 

logo = l1.logo.read()

머 쉽네. 그냥 선언 필드의 read() 함수로 읽어 진다는 것. 내부 컬렉션이 분리되어 있던 말던 그냥 읽으면 된다. MongoEngine에서 잘 정리하고 구현해 뒀겠찌

 

파일 삭제

삭제는 어떻게?

예제처럼 일단 지우고 싶은 다큐먼트를 찾아낸다. 그리곤 해당 필드의 delete() 함수로 지우면 끝.

l1 = lang.objects(name='Python').first()
l1.logo.delete()
l1.save()

 

파일 변경

파일 내용을 통째로 바꾸고 싶다. 새로 추가하고 싶진 않고 그렇다면 아래와 같이 replace() 함수로 가능하다.

파일을 다시 읽어서 f 에 넣어두고 신규입력에 사용한 put 대신에 replace 함수를 쓰면 된다.

l1 = lang.objects(name='Python').first()
f=open('newlogo.png','rb')
l1.logo.replace(f,content_type='image/png')
l1.save()

 

어째 내가 읽고 아는 것 보단, 요로케 글로 정리해 두는게 더 힘듬

블로그 아무나 하는게 아니다. 쩝

부족하거나 틀리더라도 머 내 정리인걸, 참고만 하시길

 

BJ.

요즘은 자주 씻어야 한다. 빡빡...머리속도 션하게 씻고싶다

Sora Shimazaki 님의 사진, 출처: Pexels