[Django] DB 여러개 세팅

오동훈·2022년 8월 31일
0

Database

목록 보기
35/39

지금까지 DB를 하나만 연결해서 이용해 봤는데, 여러 개의 DB를 연동해야 할 일이 생겨 작업하고 기록하려 한다.

DB를 여러 개 이용하려면 총 4단계의 작업이 필요하다! 하나씩 알아봐보자

1. DB 정보 추가

원래 기본적으로 다음과 같이 설정되어 있다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '연동할 MySQL의 데이터베이스 이름',
        'USER': 'DB 접속 계정명',
        'PASSWORD': '해당 DB 접속 계정 비밀번호',
        'HOST': 'DB IP 주소',
        'PORT': '포트 번호',
    }

하나를 더 추가하게 되면 다음과 같다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '연동할 MySQL의 데이터베이스 이름',
        'USER': 'DB 접속 계정명',
        'PASSWORD': '해당 DB 접속 계정 비밀번호',
        'HOST': 'DB IP 주소',
        'PORT': '포트 번호',
    },
    'test1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '연동할 MySQL의 데이터베이스 이름',
        'USER': 'DB 접속 계정명',
        'PASSWORD': '해당 DB 접속 계정 비밀번호',
        'HOST': 'DB IP 주소',
        'PORT': '포트 번호',
    }
}

현재는 test1이라는 이름의 별명으로 두 번째 DB를 추가했는데, 각자 원하는 이름으로 수정 가능하다.

단, default도 원하는 이름으로 수정해봤는데 기본적으로 가지고 가야 할 이름이라고 에러가 발생했다.
default는 수정이 되지 않는다!

2. DB router 설정

Django에서 어떤 DB를 바라볼 것인지를 위한 router.py를 설정해줍니다.
설치 경로는 어떤 app 하위에 만들어도 상관은 없습니다. 추후에 경로 설정만 제대로 해주면 됩니다!

📃{{appname}}/dbrouter.py

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

    """
    user_data 앱의 모델을 조회하는 경우 users_db로 중계한다.
    """
    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):
        """
        user_data 앱의 모델을 기록하는 경우 users_db로 중계한다.
        """
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        user_data 앱의 모델과 관련된 관계 접근을 허용한다.
        """
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        user_data 앱의 모델에 대응하는 표가 users_db 데이터베이스에만 생성되도록 한다.
        """
        return None

다음 부분에는 1번에서 설정한 별명으로 세팅을 진행해줘야 한다.

def __init__(self):
        self.model_list = ['default', 'test1']

3. DB router 경로 설정

📃config/settings.py

XXXX는 App 이름이다. 아래의 내용을 settings.py에 추가해주면 된다.

DATABASE_ROUTERS = ['XXXX.dbrouter.MultiDBRouter']

4. model 설정

각각의 테이블이 어떤 DB를 바라보는지 설정해주어야 한다.
app_label의 이름을 1번에서 설정한 별명으로, 연결짓고 싶은 DB 별명으로 설정해주면 된다.

class Test0(models.Model):
    .
    .
    .

    class Meta:
        managed = False
        app_label = "default"
        db_table = 'dbtest0'

class Test1(models.Model):
    .
    .
    .

    class Meta:
        managed = False
        app_label = "test1"
        db_table = 'dbtest1'
profile
삽질의 기록들🐥

0개의 댓글