본문 바로가기
개발 이야기/Django

[Django] Replica DB 사용 시 읽기전용/쓰기전용 Database 분리하기

by _ppuing 2022. 9. 6.
반응형

DB replica 를 사용할 때 읽기전용으로 replica를 사용하고, 쓰기전용으로 main(master) DB를 사용하도록 하는설정

replica_1, replica_2 를 settings.py의 DATABSES 에 선언했다고 가정

import random

class DBRouter(object):
    def db_for_read(self, model, **hints):
        return random.choice(["replica_1", "replica_2"])

    def db_for_write(self, model, **hints):
        return "default"
        
    def allow_relation(self, obj1, obj2, **hints):
    	return True 
    
    def allow_migrate(self, db, app_label, model_name=None, **hints):
    	return True

 

settings.py 에서 

DATABSE_ROUTERS = ['path.to.DBRouter']

 

테스트할 때 replica_1, replica_2 의 데이터 싱크가 되지 않으므로 BaseTest 에서 아래와 같이 설정

from django.db import databases


class BaseTestCase(TransactionTestCase):
    databases = ["default", "replica_1", "replica_2"]

    @classmethod
    def setUpClass(cls):
        connections["replica_1"]._orig_cursor = connections["replica_1"].cursor
        connections["replica_1"].cursor = connections["default"].cursor
        connections["replica_2"]._orig_cursor = connections["replica_2"].cursor
        connections["replica_2"].cursor = connections["default"].cursor
        super().setUpClass()

    @classmethod
    def tearDownClass(cls):
        connections["replica_1"].cursor = connections["replica_1"]._orig_cursor
        connections["replica_2"].cursor = connections["replica_2"]._orig_cursor
        super().tearDownClass()
        
    ....
반응형

댓글