요거요거 DB 에 바이너리 데이터를 입력해 둬야 한다.
머 FTP를 이용해서 파일은 따로하고, DB에는 Meta 데이터만 넣고 처리할 수 있으나 한번에 되는게 효율적이긴 하고
사용자도 더 편리할 듯~~~~
다행히 MongoDB 를 쓰기 위해 사용준인 MongoEngine에는 FileField 라는 것이 정의되어 있다.
간단하게 사용할 수 있는 예제를 아래 페이지에서 찾아 낼 수 있었다.
https://www.tutorialspoint.com/mongoengine/mongoengine_gridfs.htm
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 하나가 할당되어 있는게 다였다.
머지, 어데로 갔나 찾아보자.
요상한 컬렉션이 자동으로 생겨져 있네 의심해보자 :)
fs.chunks 에 실제 파일 데이터가 들어 있고
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
'IT > DB' 카테고리의 다른 글
Mongoengine 키, 인덱스 등록시 2개 이상 필드로 unique 등록 (0) | 2021.08.03 |
---|---|
MongoDB 기본적인 내용 이해 - 글 소개 (0) | 2021.07.22 |
우분투 18.04 LTS MongoDB 설치 및 설정, 관리자 계정 추가 정리본 (0) | 2021.07.08 |
MongoDB 연결된 상태 보기 (0) | 2021.07.01 |
Flask MongoEngine 쿼리 filter() 함수 문자열 - Query Operators (0) | 2021.06.21 |