>  기사  >  백엔드 개발  >  Django 다중 데이터베이스 구성 튜토리얼

Django 다중 데이터베이스 구성 튜토리얼

不言
不言원래의
2018-06-01 14:45:011254검색

이 글은 주로 참고할 가치가 있는 Django 다중 데이터베이스 구성 튜토리얼을 소개합니다. 이제는 모든 사람과 공유합니다. 필요한 친구들이 참고할 수 있습니다.

Django 프로젝트에서는 여러 개의 APP 애플리케이션이 존재하는 것이 매우 일반적입니다. 하나의 프로젝트에서 서로 다른 APP를 서로 다른 데이터베이스에 연결하려는 경우가 있습니다. 이 경우 여러 데이터베이스 연결을 설정해야 합니다.

1. 프로젝트 설정 구성 수정

settings.py에서 연결해야 하는 여러 데이터베이스 연결 문자열 구성

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'sqlite3'),
  },
  'db01': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_01'),
  },
  'db02': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_02'),
  },
}

이제 3개의 데이터베이스와 기본 라이브러리인 A db01을 사용한다고 가정합니다. db02

2 데이터베이스의 라우팅 규칙 방법을 설정합니다

settings.py

DATABASE_ROUTERS = ['Prject.database_router.DatabaseAppsRouter']

Project: 생성된 django 프로젝트 이름(project_name)

database_rou ter: 경로 정의 Database_router.py 파일 이름, 이 파일 이름은 직접 정의할 수 있습니다

DatabaseAppsRouter: 라우팅 규칙의 클래스 이름, 이 클래스는 Database_router.py 파일에 정의됩니다

3 APP에 해당하는 데이터베이스 라우팅 테이블을 설정합니다.

각 앱이 연결하려는 데이터베이스가 일치해야 합니다. settings.py 파일에서 다음 구성을 수행하세요.

DATABASE_APPS_MAPPING = {
  # example:
  # 'app_name':'database_name',
  'app02': 'db02',
  'app01': 'db01',
  'admin': 'db01',
  'auth': 'db01',
  'contenttypes': 'db01',
  'sessions': 'db01',
}

위 app01과 app02는 프로젝트에서 할당된 앱 이름입니다. 각각 db01 및 db02에 저장됩니다.

Django의 자체 테이블을 정의된 데이터베이스에 생성하려면 admin, auth, contenttypes, 세션을 세트 데이터베이스에 지정할 수 있습니다. 지정하지 않으면 자동으로 기본 데이터베이스에 생성됩니다. . 데이터베이스 라우팅 규칙 생성

프로젝트 루트 경로(settings.py 파일과 동일한 수준)에 데이터베이스_router.py 파일 생성:

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
  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
  def allow_migrate(self, db, app_label, model=None, **hints):
    """
    Make sure the auth app only appears in the 'auth_db'
    database.
    """
    if db in DATABASE_MAPPING.values():
      return DATABASE_MAPPING.get(app_label) == db
    elif app_label in DATABASE_MAPPING:
      return False
    return None

5.

해당 APP에서 데이터 테이블의 모델을 생성할 때 테이블의 app_label 이름을 지정해야 합니다. 지정하지 않으면 다음과 같이 기본으로 구성된 데이터베이스 이름

으로 생성됩니다.

in app01 Create app02

class Users(models.Model):
  name = models.CharField(max_length=50)
  passwd = models.CharField(max_length=100)
  def __str__(self):
    return "app01 %s " % self.name
  class Meta:
    app_label = "app01"

app02

class Users(models.Model):
  username = models.CharField(max_length=100)
  password = models.CharField(max_length=50)
  age = models.IntegerField()
  def __str__(self):
    return "app02 %s" % self.username
  class Meta:
    app_label = "app02"
class Book(models.Model):
  user = models.ForeignKey("Users", on_delete=models.CASCADE)
  bookname = models.CharField(max_length=100)
  def __str__(self):
    return "%s: %s" % (self.user.username, self.bookname)
  class Meta:
    app_label = "app02"

에서 모델을 생성하고, app_label을 지정하지 않고 app03에서 모델을 생성하고, default

class Users(models.Model):  
  username = models.CharField(max_length=100)

6에서 모델을 생성합니다.

django의 마이그레이션을 사용하여 생성된 테이블을 생성할 때 --database 매개변수를 추가해야 합니다. 그렇지 않으면 app_label을 지정하지 않은 APP 모델의 테이블은 다음과 같이 기본적으로 지정된 데이터베이스에 생성됩니다.

Download app01 모델의 테이블을 db01

./ manage.py migrate --database=db01

app02 아래의 모델의 테이블을 db02

./ manage.py migrate --database=db02

의 데이터베이스 "db_02"에 생성합니다. app03 아래의 모델은 기본 데이터베이스 "sqlite3"에 생성됩니다

./ manage.py migrate

위 생성이 완료되면 다른 모든 생성, 쿼리, 삭제 및 기타 작업을 평소와 같이 수행할 수 있습니다.

models.User.objects.using(dbname).all()

이렇게 작동합니다.

관련 권장사항:

Django 프로젝트에 여러 애플리케이션이 포함된 경우 URL을 구성하는 방법

위 내용은 Django 다중 데이터베이스 구성 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.