Рубрики
Без рубрики

Как настроить несколько баз данных на Django

Этот пост блога покажет вам, как настроить несколько баз данных в приложении Django. … Теги с Джанго, Питоном, Postgres.

Этот пост блога покажет вам, как настроить несколько баз данных в приложении Django.

Основная настройка

  1. Создайте свою виртуальную среду
  2. Создать проект Django
  3. Создайте вашу базу данных серверы

Определение ваших баз данных

Первый шаг для использования более одной базы данных с Django – это сообщить Django о серверах баз данных, которые вы будете использовать. Это сделано с использованием «Базы данных» параметр. Базы данных могут иметь какие-либо псевдонима. Тем не менее, псевдоним по умолчанию имеет особое значение. Django использует базу данных с псевдонимами по умолчанию, когда другая база данных не была выбрана.

Ниже приведен пример settings.py Фрагмент, определяющий две базы данных – база данных по умолчанию PostgreSQL и база данных MySQL под названием users_db :

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit'
    },
    'users_db': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'priv4te'
    }
}

Django требует, чтобы по умолчанию Быть определена запись базы данных, но словарь параметров может быть оставлен пустым, если он не будет использоваться. Для этого вы должны настроить Database_roouters Для всех моделей ваших приложений, так что никаких запросов не направляются в базу данных по умолчанию.

Ниже приведен пример settings.py Снаппин, определяющий две базы данных не по умолчанию, с по умолчанию Въезд преднамеренно оставил пустую:

DATABASES = {
    'default': {},
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'superS3cret'
    },
    'customers': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_cust',
        'PASSWORD': 'veryPriv@ate'
    }
}

Если вы пытаетесь получить доступ к базе данных, которую вы не определены в вашем Базы данных Установка, Django поднимет django.utils.Connection. ConnectionDoesnotexist исключение.

Синхронизация ваших баз данных

мигрировать Команда управления работает на одной базе данных за раз. По умолчанию он работает на по умолчанию база данных, но, предоставляя –датабаза Опция, вы можете сказать это, чтобы он синхронизировал другую базу данных. Итак, чтобы синхронизировать все модели на все базы данных в первом примере выше, вам нужно позвонить:

$ ./manage.py migrate 
$ ./manage.py migrate --database=users

Если вы не хотите, чтобы каждое приложение было синхронизировано на конкретной базе данных, вы можете определить Маршрутор базы данных Это реализует политику, ограничая доступность конкретных моделей. Если, как в примере выше, вы оставили по умолчанию База данных пустой, вы должны предоставить имя базы данных каждый раз, когда вы запускаете мигрировать Отказ

$ ./manage.py migrate --database=users
$ ./manage.py migrate --database=customers

Большинство других Django-admin Команды, которые взаимодействуют с базой данных, работают так же, как мигрировать – Они когда-либо работают только на одной базе данных за раз, используя –датабаза Чтобы контролировать использование базы данных.

Исключение из этого правила является Макемиграция команда. Он подтверждает историю миграции в базах данных, чтобы ловить проблемы с существующими файлами миграции перед созданием новых миграций. По умолчанию он проверяет только базу данных по умолчанию, но она консультируется на allow_migrate () Метод маршрутизаторов, если какие-либо установлены.

Автоматическая маршрутизация базы данных

Как только вы получили ваши базы данных, определенные в Базы данных Установка, теперь нам нужно будет обрабатывать автоматическую маршруту.

  1. Создайте папку под названием «Маршрутизаторы»
  2. Внутри папки Создайте файл под названием db_roouters.py.
  3. Создать маршрутизатор базы данных под названием Authroterer Чтобы контролировать все операции базы данных на моделях в автор и ContentTypes – Добавьте следующий код внутри db_roouters.py файл:
class AuthRouter:
    route_app_labels = {'auth', 'contenttypes'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if (
            obj1._meta.app_label in self.route_app_labels or
            obj2._meta.app_label in self.route_app_labels
        ):
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'auth_db'
        return None

Создайте маршрутизатор для вашей другой базы данных Route_app_labels Добавьте приложения, которые вы хотите позволить получить доступ к базе данных. Смотрите следующий код, например:

class UsersRouter:
    route_app_labels = {'users', 'accounts'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'users_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'users_db'
        return None


    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'users_db'
        return None   

Если приложение Имя модель соответствует любому значению в Route_app_labels. Затем он возвращает и использует выбранную базу данных. В этом случае только Пользователи и Счета Приложения могут получить доступ к users_db база данных, как это указано в Route_app_labels. .

Маршрутизатор базы данных – это класс, который обеспечивает до четырех способов:

  1. db_for_read (модель, ** подсказки)
  2. db_for_write (модель, подсказки)
  3. RUBLE_RELATION (OBJ1, OBJ2, ** HINTS)
  4. allow_migrate (db, app_label ,, ** hints)

Больше информации на Django Docs – методы маршрутизатора базы данных

Подключение маршрутизаторов

Маршрутизаторы базы данных установлены с помощью Database_roouters параметр. Этот параметр определяет список имен классов, каждый указывающий маршрутизатор, который должен использоваться главным маршрутизатором.

Мастер-маршрутизатор используется операциями базы данных Django для выделения использования базы данных. Всякий раз, когда запрос должен знать, какую базу данных использовать, он вызывает главный маршрутизатор, обеспечивающий модель и подсказку (если доступно). Затем Django пытается в свою очередь, пока не будет найден предложение базы данных.

Наконец, в Настройки Файл, мы добавляем следующий код (подстановка Path.to. С фактическим Путью Python к модулям, где определены маршрутизаторы):

DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.UsersRouter']

Порядок, в котором перерабатываются маршрутизаторы, является значительным. Маршрутизаторы будут запрошены в порядке их перечислены в Database_roouters параметр.

В этом примере Authroterer обрабатывается до UsersRouter И, как следствие, решения, касающиеся моделей воодушевления, обрабатываются до того, как сделано любое другое решение.

Вручную выбрать базу данных

Django также предоставляет API, который позволяет вам поддерживать полный контроль над использованием базы данных в вашем коде. Указанное вручную распределение базы данных примет приоритет над базой данных, выделенной маршрутизатором.

Вы можете выбрать базу данных для Queryset В любой момент в цепочке запроса “. Звоните Использование () на Queryset Чтобы получить еще один запрос, который использует указанную базу данных.

Использование () принимает один аргумент: псевдоним базы данных, на котором вы хотите запустить запрос.

Например:

>>> # This will run on the 'default' database.
>>> Publisher.objects.all()

>>> # So will this.
>>> Publisher.objects.using('default').all()

>>> # This will run on the 'users' database.
>>> Publisher.objects.using('users').all()

Спасибо за чтение! Если у вас есть какие-либо вопросы, проблемы, обратная связь или исправления, пожалуйста, дайте мне знать!

Оригинал: “https://dev.to/minhvuong1/how-to-set-up-multiple-databases-on-django-1c76”