출처: https://woolbro.tistory.com/82
일단 기록용으로 저장해두되 실제로 적용하고 결과물까지 캡처해서 다시 작성하기
안녕하세요~~ 회사 내부에서 장고를 사용하면서 공부하다가 정리 해 놓고 싶어서 간단하게 적어보겠습니다~
프로젝트를 진행 하면서 하나 이상의 디비(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에서 데이터를 가져옵니다.
누군가에게는 도움이 되었기를 바랍니다ㅠㅠ
출처: https://woolbro.tistory.com/82 [개발자 울이 노트:티스토리]
'Backend > Django' 카테고리의 다른 글
Django docker-compose 에서 로컬, 도커 환경 분리하기 (0) | 2024.03.16 |
---|---|
Django Abstract Model 사용 (0) | 2024.03.13 |
Django order_by와 annotate, extra 활용 (0) | 2024.03.13 |
Django queryset 파보기 (0) | 2024.03.12 |
Django Serializer의 Fields (1) | 2024.03.12 |