[Django] 데이터베이스 연결하기 - 여러 DB 연결

hwwwa·2023년 2월 20일
0

🚀 Django Tutorial

목록 보기
5/5

Django 개발을 하던 중 추가로 데이터베이스를 연결하여 사용할 필요가 생겼다.

먼저 추가로 연결할 데이터베이스를 설치 후 실행해준 다음 아래의 과정을 진행하면 된다.

Django에서 DB, DB Router 설정

  • settings.py에 DB Router와 추가로 연결할 DB를 설정
    • 언제 어느 DB를 사용할지 정해주는 것이 필요하므로 라우터를 사용
# DB Router
DATABASE_ROUTERS = [ 
	'core.dbrouter.MultiDBRouter', 
]

DATABASES = {
	# 기존 MySQL DB
	'default': {
		'ENGINE': 'django.db.backends.mysql',
		'NAME': 'testdjango',
		'USER' : 'root',
		'HOST' : 'localhost',
		'PORT' : '3306'
	},
	# 추가로 연결할 MySQL DB
	'referencedb1': { 
		'ENGINE': 'django.db.backends.mysql', 
		'NAME': 'DB명', 
		'USER' : '계정 이름', 
		'PASSWORD' : '계정 비밀번호', 
		'HOST':'DB 주소', 
		'PORT':'포트 번호' 
	}
}

DB 연결

$ python3 manage.py makemigrations polls
$ python3 manage.py migrate
## referencedb1 DB와 migration 
$ python3 manage.py makemigrations --database referencedb1
$ python3 manage.py migrate --database referencedb1

## referencedb1 DB의 model 생성
$ python3 manage.py inspectdb --database referencedb1

DB Router 작성

  • DB Router 내에 작성했던 대로 파이썬 파일과 클래스를 만들어 주어야함
  • 장고 앱 아래에 dbrouter.py 작성
    • init 함수에 작성하는 model list에는 settings.py에 작성했던 DB 이름 그대로 작성해주어야 함
class MultiDBRouter(object):  
	def __init__(self): 
		self.model_list = ['default', 'redis-7-0-8'] 

	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

Model 작성

  • 장고 앱 아래의 models.py에 모델 작성 시 Meta 클래스에 app_label을 추가로 작성
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'

0개의 댓글