Django 다중 데이터베이스 연결 구현 방법 분석

본고는 하나의django프로젝트에서 여러 데이터베이스를 사용하는 방법, 여러 데이터베이스의 연결과 여러 데이터베이스를 가져올 때 데이터를 가져오는 방법을 설명한다.
직접 간단한 방법을 제시하세요. 공식 강좌에 대해 더 알고 싶으면 클릭하세요여기
코드
1. 앱마다 데이터베이스를 따로 설정할 수 있다
settings.py에는 데이터베이스에 대한 설정이 있고 기본 데이터베이스 default가 있습니다. 우리는 다른 것을 추가할 수 있습니다. 예를 들어 다음과 같습니다.

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  },
  'db1': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'dbname1',
    'USER': 'your_db_user_name',
    'PASSWORD': 'yourpassword',
    "HOST": "localhost",
  },
  'db2': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'dbname2',
    'USER': 'your_db_user_name',
    'PASSWORD': 'yourpassword',
    "HOST": "localhost",
  },
}
 
# use multi-database in django
# add by WeizhongTu
DATABASE_ROUTERS = ['project_name.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
  # example:
  #'app_name':'database_name',
  'app1': 'db1',
  'app2': 'db2',
}
프로젝트에서_name 폴더에 데이터베이스 저장_router.py 파일, 내용은 다음과 같습니다.

# -*- coding: utf-8 -*-
from django.conf import settings
 
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
 
 
class DatabaseAppsRouter(object):
  """
  A router to control all database operations on models for different
  databases.
 
  In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
  will fallback to the `default` database.
 
  Settings example:
 
  DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
  """
 
  def db_for_read(self, model, **hints):
    """"Point all read operations to the specific database."""
    if model._meta.app_label in DATABASE_MAPPING:
      return DATABASE_MAPPING[model._meta.app_label]
    return None
 
  def db_for_write(self, model, **hints):
    """Point all write operations to the specific database."""
    if model._meta.app_label in DATABASE_MAPPING:
      return DATABASE_MAPPING[model._meta.app_label]
    return None
 
  def allow_relation(self, obj1, obj2, **hints):
    """Allow any relation between apps that use the same database."""
    db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
    db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
    if db_obj1 and db_obj2:
      if db_obj1 == db_obj2:
        return True
      else:
        return False
    return None
 
  # for Django 1.4 - Django 1.6
  def allow_syncdb(self, db, model):
    """Make sure that apps only appear in the related database."""
 
    if db in DATABASE_MAPPING.values():
      return DATABASE_MAPPING.get(model._meta.app_label) == db
    elif model._meta.app_label in DATABASE_MAPPING:
      return False
    return None
 
  # Django 1.7 - Django 1.11
  def allow_migrate(self, db, app_label, model_name=None, **hints):
    print db, app_label, model_name, hints
    if db in DATABASE_MAPPING.values():
      return DATABASE_MAPPING.get(app_label) == db
    elif app_label in DATABASE_MAPPING:
      return False
    return None
이렇게 하면 지정된 앱이 지정한 데이터베이스를 사용하는 것을 실현할 수 있다. 물론 너도 여러 개의 qlite3를 함께 사용할 수 있다. 이것은 모든 앱에 단독으로 데이터베이스를 설정할 수 있는 것과 같다!설정하지 않거나 설정하지 않은 앱은 자동으로 기본 데이터베이스를 사용합니다.
2. 지정된 데이터베이스를 사용하여 작업 수행
검색된 문장 뒤에 using (dbname) 을 사용하여 조작할 데이터베이스를 지정하면 됩니다
# 질의
YourModel.objects.using('db1').all()
아니면 Your Model.objects.using('db2').all()
# 저장 또는 삭제
user_obj.save(using='new_users')
user_obj.delete(using='legacy_users')
3. 여러 데이터베이스 연결 시 데이터 가져오기 내보내기
사용할 때와 데이터베이스의 차이점은 다음과 같습니다.
defalut (기본 데이터베이스) 가 아니라면 명령 뒤에 --database = 데이터베이스에 대응하는 settings를 추가합니다.py의 이름은 다음과 같습니다. --database=db1 또는 --database=db2
데이터베이스 동기화(테이블 만들기)
# Django 1.6 및 다음 버전
python manage.pysyncdb#기본 데이터베이스 동기화, 원래와 다름 없음
# 동기화 데이터베이스db1 (주의: 데이터베이스 이름이 아니라db1,settings.py에 있는db1입니다. 하지만 이 두 이름을 같게 해서 사용하기 쉽습니다)
python manage.py syncdb --database=db1
# Django 1.7 이상 버전
python manage.py migrate --database=db1
데이터 내보내기
python manage.py dumpdata app1 --database=db1 > app1_fixture.json
python manage.py dumpdata app2 --database=db2 > app2_fixture.json
python manage.py dumpdata auth > auth_fixture.json
데이터베이스 가져오기
python manage.py loaddata app1_fixture.json --database=db1
python manage.py loaddata app2_fixture.json --database=db2
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기