지금까지 DB를 하나만 연결해서 이용해 봤는데, 여러 개의 DB를 연동해야 할 일이 생겨 작업하고 기록하려 한다.
DB를 여러 개 이용하려면 총 4단계의 작업이 필요하다! 하나씩 알아봐보자
원래 기본적으로 다음과 같이 설정되어 있다.
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는 수정이 되지 않는다!
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']
📃config/settings.py
XXXX는 App 이름이다. 아래의 내용을 settings.py에 추가해주면 된다.
DATABASE_ROUTERS = ['XXXX.dbrouter.MultiDBRouter']
각각의 테이블이 어떤 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'