레이블이 router인 게시물을 표시합니다. 모든 게시물 표시
레이블이 router인 게시물을 표시합니다. 모든 게시물 표시

20241227

Python + Django + 복수 Mysql

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'

참고 자료

더 자세한 내용은 아래 링크를 참고하세요: