Django에서 DB와 DB Router 설정하기
Django에서는 다중 데이터베이스를 사용할 때 DB Router를 통해 특정 모델이 어느 데이터베이스를 사용할지 정의할 수 있습니다. 이 글에서는 settings.py
에서 DB Router를 설정하고, 다중 데이터베이스를 활용하는 방법을 단계별로 설명합니다.
1. settings.py
에 DB Router 및 추가 DB 설정
우선, 기본 데이터베이스 외에 추가로 연결할 데이터베이스를 정의하고, DB Router를 설정합니다.
# settings.py
# DB Router 설정
DATABASE_ROUTERS = [
'core.dbrouter.MultiDBRouter',
]
# 데이터베이스 설정
DATABASES = {
# 기본 MySQL 데이터베이스
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdjango',
'USER': 'root',
'HOST': 'localhost',
'PORT': '3306',
},
# 추가로 연결할 MySQL 데이터베이스
'referencedb1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB명',
'USER': '계정 이름',
'PASSWORD': '계정 비밀번호',
'HOST': 'DB 주소',
'PORT': '포트 번호',
},
}
2. DB 연결 및 마이그레이션
아래 명령어를 통해 데이터베이스와 연결하고, 마이그레이션을 수행합니다.
기본 데이터베이스 마이그레이션
$ python3 manage.py makemigrations polls
$ python3 manage.py migrate
추가 데이터베이스(referencedb1
) 마이그레이션
$ python3 manage.py makemigrations --database referencedb1
$ python3 manage.py migrate --database referencedb1
추가 데이터베이스의 모델 생성
추가 데이터베이스에서 테이블 정보를 자동으로 모델로 생성하려면 아래 명령어를 실행합니다.
$ python3 manage.py inspectdb --database referencedb1
3. DB Router 작성
DB Router는 모델과 데이터베이스 간의 매핑을 정의합니다. Django 앱 폴더에 dbrouter.py
파일을 생성하여 다음과 같이 작성합니다.
# core/dbrouter.py
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
4. 모델 작성 시 Meta
클래스에 app_label 추가
추가 데이터베이스와 연결된 모델은 Meta
클래스에 app_label
을 지정해야 합니다. 또한 managed = False
를 설정하여 Django가 해당 테이블을 관리하지 않도록 합니다.
# 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'
참고 자료
더 자세한 내용은 아래 링크를 참고하세요:
댓글 없음:
댓글 쓰기