Django 여러 데이터베이스 연결 및 읽기/쓰기 분리

3246 단어
한 항목에 대량의 데이터가 있을 때, 당신의 모든 IO 조작은 한 데이터베이스에서 조작되어 프로젝트의 성능을 떨어뜨릴 수 있다.만약 프로젝트의 데이터를 읽기와 쓰기를 분리할 수 있다면 프로젝트의 성능을 크게 향상시킬 것이다.Django가 자체적으로 가지고 있는 메커니즘도 이에 대해 지원을 제공했다.우리는 간단하게 조작할 수 있다.(물론 데이터의 동기화는 동지의 협조를 필요로 한다)
구성 파일 수정
Django의 기본값은default이며, 형식에 따라 새로운 설정을 직접 추가합니다.
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.sqlite3',
 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 },
 'db2': {
 'ENGINE': 'django.db.backends.sqlite3',
 'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
 }
}

물론 기본 sqlite3을 사용하지 않으려면 mysql을 사용하려면 스스로 설정해야 합니다
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.mysql',
 'HOST': '127.0.0.1', #        ip
 'PORT': 3306, #        port
 'USER': 'django', #         
 'PASSWORD': 'django', #        
 'NAME': 'djangobase' #     
 },
 'slave': {
 'ENGINE': 'django.db.backends.mysql', 
 'HOST': '127.0.0.1',
 'PORT': 8306,
 'USER': 'django_slave',
 'PASSWORD': 'django_slave',
 'NAME': 'djangobase_slave'
 }
}  

프로젝트 디렉토리의init__파일에 다음 코드를 추가하여 데이터 연결 방식을pymysql로 변경합니다
import pymysql
pymysql.install_as_MySQLdb()

데이터 설정을 수정한 후에 모델스에서 사용할 수 있습니다.py 파일에서 테이블을 만들면 데이터베이스 이전을 진행할 수 있습니다
python manage.py makemigrations #  migrations        
python manage.py migrate --database default #         
python manage.py migrate --database db2 #         ,            

수동 읽기/쓰기 분리
데이터베이스 관련 조작을 만나면 수동으로 사용할 해당 데이터베이스를 지정해야 하기 때문에 여분의 설정을 할 필요가 없다. 그러나 데이터의 읽기와 쓰기 조작이 너무 빈번할 때 이 방법은 약간 번거롭다.
from django.shortcuts import render, HttpResponse
from app001 import models
# Create your views here.
def write(request):
 models.User.objects.using('default').create(name='  ', pwd='123', phone=1234)
 return HttpResponse('   ')
def read(request):
 obj = models.User.objects.filter(id=1).using('db2').first()
 return HttpResponse('   ')

자동 읽기 및 쓰기 분리
데이터베이스 루트를 설정하여 읽기 분리를 자동으로 실현하면 매번 읽기 전용 데이터베이스를 수동으로 지정할 필요가 없다.
프로젝트 app에서db 만들기router.py 파일, 그리고 이 파일에 데이터베이스 루트 클래스를 정의하여 읽기와 쓰기를 분리합니다. 이 클래스는 최대 네 가지 방법을 제공합니다. 각각:dbfor_read、db_for_write、allow_relation、allow_migrate, 다음은 세 개만 썼습니다.
데이터베이스 라우팅 클래스 정의
class MasterSlaveDBRouter(object):
 """           """
 
     def db_for_read(self, model, **hints):
     """    """
     return "slave"
 
     def db_for_write(self, model, **hints):
     """    """
     return "default"

     def allow_relation(self, obj1, obj2, **hints):
     """        """
     return True  

Router 구성
settings에서.py에서 DATABASE 지정ROUTERS
DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

여러 데이터베이스 라우트를 지정할 수 있습니다. 예를 들어 읽기 작업의 경우 Django는 모든 라우팅의db 를 순환합니다.for_read () 방법 중 하나가 되돌아올 때까지 이 데이터베이스를 사용하여 현재 작업을 진행합니다.

좋은 웹페이지 즐겨찾기