728x90
반응형
환경
- Python 3.6
- Django 2.1.1
- ElasticSearch 3.6.x
요약
Django와 ElasticSearch을 연동해서 사용 중이다. 이번달은 LOG_201901, 다음달은 LOG_201902 ...으로 동적으로 INDEX (RDB 용어로는 테이블)을 생성하여 사용하고 싶다. ORM(Model)의 Meta 정보에 넣었으나 코드를 넣었으나 INDEX가 날짜별로 자동 생성되지 않고 처음 생성된 INDEX(예) LOG_201901) 에만 계속 쌓이는 문제가 있었다.
실행한 model 소스는 아래와 같다. 무엇이 문제일까?
from elasticsearch_dsl import DocType, Text, Integer, Date
import datetime
class Statistics(DocType):
mall_id = Text()
uuid = Text()
created_time_at = Date()
class Meta:
today = datetime.datetime.today().strftime('%Y%m')
# 동적 인덱스 생성
index = 'log_%s' % today
이유는 간단하다. Meta에 설정된 INDEX는 한 번 로딩이 되고나면 Runtime시에는 호출을 하지 않는다.
아래와 같이 바꿔주자
대응
대응은 간단하다. save, search 등 상속 메소드를 extend하여 INDEX를 동적으로 바꿔주는 코드를 앞단에 넣어주는 것이다.
from elasticsearch_dsl import DocType, Text, Integer, Date
import datetime
def get_index_name():
today = datetime.datetime.today().strftime('%Y%m')
return 'log_%s' % today
class Statistics(DocType):
mall_id = Text()
uuid = Text()
created_time_at = Date()
class Meta:
index = get_index_name()
def save(self, **kwargs):
# dynamic index change (인덱스 이름 변경)
setattr(self.meta, 'index', get_index_name())
return super(Statistics, self).save(**kwargs)
728x90
반응형
'백엔드 > 개발' 카테고리의 다른 글
Spring Boot - Hello World 시작해보기 (0) | 2022.04.13 |
---|---|
Spring Boot 환경설정 (0) | 2022.04.13 |
Django - 프론트엔드 SPA 연동시 context parameter 설정 (0) | 2018.12.31 |
Django - 웹 서버 기동시 LOG 파일 엑세스 오류 (0) | 2018.12.31 |
Django - DEBUG = False 일 경우 정적 파일 경로 설정 방법 (2) | 2018.12.31 |