Old Branch

TIP - 장고 데이터베이스 여러개 사용하기 (Django multidatabase)

woolbro 2020. 3. 20. 09:51
반응형

안녕하세요~~ 회사 내부에서 장고를 사용하면서 공부하다가 정리 해 놓고 싶어서 간단하게 적어보겠습니다~

 

프로젝트를 진행 하면서 하나 이상의 디비(Database)를 바라보아야 할 때가 있죠!

 

이렇게 저렇게 찾아보다가, 다들 적용하는 방법만 나와있고 실제로 사용 한 부분이 없어서 이해력이 부족한 저로서는 너무 어려운.....

 

그래서 적용하고 제가 정리 해 보았습니다!

 

 


프로젝트 구조

저의 프로젝트 구조는 다음과 같습니다!! 설명을 보실때 참고해서 보시면 도움이 되지 않을까요~~


Settings.py

우선 데이터 베이스를 적용하려면, 장고 settings.py에 DB정보를 적용 해 주어야겠죠~?

 

# config/settings.py
# 장고 세팅파일. 꼭 config일 필요는 없지만, 제 폴더가 config 이기때문에....


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '디비1',
        'USER' : '계정 이름',
        'PASSWORD' : '계정 비밀번호',
        'HOST':'디비주소',
        'PORT':'포오오오트'
    },
    'referencedb1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '디비2',
        'USER' : '계정 이름2',
        'PASSWORD' : '계정 비밀번호2',
        'HOST':'디비주소2',
        'PORT':'포오오오트'
    }
}

우선  migration이나, inspectdb등을 통해서 db를 가져올 때에 기본적으로는 'default' 디비를 받아오게 됩니다.

 

즉,

python3 manage.py migration  ## default 디비와 마이그레이션
python3 manage.py inspectdb ## default 디비를 model로 만들어줌

이렇게 되는거죠, 우리가 쓴 명령어중에 referencedb1와 만날 수 있는 경우는 전혀 없습니다.

 

이 때, 위의 명령에 옵션을  아래와 같이 주면 됩니다.

python3 manage.py migration  --database referencedb1 ## reference 디비와 마이그레이션
python3 manage.py inspectdb --database referencedb1 ## reference 디비를 model로 만들어줌

 

dbrouter  작성하기

db를 두개를 연동했으니까, 언제 어느 db를 사용할지 정해주는 라우터를 작성하도록 하겠습니다.

1.  settings.py에 라우터가 있다고 알려주기

2. 라우터 작성하기

 

settings.py에 라우터 적용하기

저는 장고 앱 이름이 core입니다. 

core에 dbrouter.py를 만들고, 그 아래애 MultiDBRouter라는 클래스를 만들겁니다!

우선, 작성 할 내용을 settings.py에 적용 해 보겠습니다.

# config/settings.py
# 장고 세팅파일. 꼭 config일 필요는 없지만, 제 폴더가 config 이기때문에....

##db라우터
DATABASE_ROUTERS = [
    'core.dbrouter.MultiDBRouter',
]

##db정보
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '디비1',
        'USER' : '계정 이름',
        'PASSWORD' : '계정 비밀번호',
        'HOST':'디비주소',
        'PORT':'포오오오트'
    },
    'referencedb1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '디비2',
        'USER' : '계정 이름2',
        'PASSWORD' : '계정 비밀번호2',
        'HOST':'디비주소2',
        'PORT':'포오오오트'
    }
}

 

core/dbrouter.py 만들기

DB라우터 내에 작성했었던  대로 파이썬 파일과 클래스를 만들어 주어야합니다.

core(장고 앱)아래에 dbrouter.py를 작성해보겠습니다.

 

윗쪽의 init펑션에서 모델 리스트를 작성해주었습니다.  리스트는 settings.py에서 넣어준 db 대표이름으로 해야합니다.

###core/dbrouter.py
##core는 장고 앱 이름
## django-admin startapp djangotest라면, 앱이름은 djangotest이겠죠!

class MultiDBRouter(object):
    def __init__(self):
        self.model_list = ['default', 'referencedb1']

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.model_list:
            return model._meta.app_label

        return None

    def db_for_write(self, model, **hints):
        return None

    def allow_relation(self, obj1, obj2, **hints):
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return None

 

 

모델 사용하기

제가 찾아본 reference에서는 이 부분이 없어서 저는 너무너무 헷갈렸었어요

적용하고, 라우터를 작성하면 뭐합니까! 사용 할줄을 모르는데... ㅜㅜㅜㅜㅜㅜ 

 

자! 모델로 가봅시당

core안에있는 model입니다!

##core앱의 models.py

#core/models.py

from django.db import models


class db1_modelname1(models.Model):

	## 여기에 데이터베이스 모델 내용~~

    class Meta:
        managed = False
        app_label = "default"
        db_table = 'test1'
       
class db2_modelname1(models.Model):

	## 여기에 데이터베이스 모델 내용~~

    class Meta:
        managed = False
        app_label = "referencedb1"
        db_table = 'test2'

 

두개의 모델을 임의로 작성했는데요, 여기서 우리가 중요하게 볼 것은 클래스 내부에있는 meta 클래스입니다.

app_label에는 우리가 settings.py에서 작성 해준 db대표이름이 들어가네요~

 

즉, app_label로 표시된 db를 settings.py에서 찾아서 모델에 맞는 db를 가져오겠다! 라는 얘기입니다.

 

즉, db1_modelname1은, settings.py에 'default'로 작성된 db에서 데이터를 가져오고,

db2_modelname1은,  settings.py에 'referencedb1'로 작성된 db에서 데이터를 가져옵니다.

 

 

누군가에게는 도움이 되었기를 바랍니다ㅠㅠ