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

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

В жизни вашего Django может прийти время в жизни вашего проекта Django, где вам нужно использовать несколько баз данных …. Теги с Django, Python, база данных.

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

Пусть Django узнает о вашей базе данных

Для Django узнать о вашей базе данных (ы), вы должны добавить их в словарь базы данных в вашем проекте settings.py файл. Это выглядит так:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE\_DIR, 'db.sqlite3'),
    },
    'customers\_db': {
        'NAME': 'customers',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'postgres\_user',
        'PASSWORD': 'root'
    }
}

Добавление базы данных в settings.py это первый шаг. Django по умолчанию связывает любые модели и запросы, которые вы создаете с по умолчанию база данных. В приведенной выше конфигурации база данных по умолчанию – это база данных SQLite, помеченной как таковой. Для ассоциирования запросов или моделей с другой базой данных вы можете либо:

  1. Явное состояние, в какую базу данных использовать при выполнении запроса или сохранения в базу данных или
  2. Настройте схему маршрутизации базы данных, которая автоматически выберет правильную базу данных для вас.

Указание базы данных для использования при загрузке запросов.

Для целей настоящего поста давайте предположим, что это ваши модели:

# models.py

class Customer(models.Model):
    name = models.CharField(max_length=20)
    customer_id = models.CharField(max_length=120)

class User(models.Model):
    name = models.CharField(max_length=20)
    user_id = models.CharField(max_length=120)
    age = models.IntegerField()

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

>>> default_user = User(name='Sipho', user_id='12:3456', age=57)
>>> default_user.save() # user object saved to default database
>>> customer = Customer(name='Thandiwe Ndiweni', customer_id='86:19216857') 

# Saving to different database

>>> customer.save(using='customers_db')
>>> Customer.objects.all().using('customers_db')

Здесь вы видите это Клиент создается и извлекается из клиенты База данных, указав имя базы данных в качестве аргумента для Использование Отказ

Если вы пишете много подобных запросов, это хорошая идея написать маршрутизатор базы данных для автоматической обработки вариантов базы данных. Маршрутизатор базы данных похож на URLConfig, но для баз данных. Вот пример маршрутизатора, который вы можете написать для обработки операций с базой данных для базы данных клиентов:

class YourRouter:
    """
 A router to control all database operations on models in the
 customer application.
 """
    def db\_for\_read(self, model, \*\*hints):
        """
 Attempts to read user models go to customers\_db.
 """
        if model.\_meta.app\_label == 'user\_data':
            return 'customers\_db'
        return None

    def db\_for\_write(self, model, \*\*hints):
        """
 Attempts to write user models go to users\_db.
 """
        if model.\_meta.app\_label == 'customer\_data':
            return 'customers\_db'
        return None

    def allow\_relation(self, obj1, obj2, \*\*hints):
        """
 Allow relations if a model in the user app is involved.
 """
        if obj1.\_meta.app\_label == 'customer\_data' or \
           obj2.\_meta.app\_label == 'customer\_data':
           return True
        return None

    def allow\_migrate(self, db, app\_label, model\_name=None, \*\*hints):
        """
 Make sure the auth app only appears in the 'customers\_db'
 database.
 """
        if app\_label == 'customer\_data':
            return db == 'customers\_db'
        return None

Поместите код выше в модуле в соответствующем месте в вашем приложении, а затем укажите Django к нему, добавив эту строку в settings.py :

DATABASE\_ROUTERS = ['path.to.YourRouter']

Подставление Путь. До С фактическим модулем Python, где вы определили маршрутизатор. Далее измените модели и дайте им App_Labels:

# models.py

class Customer(models.Model):
    name = models.CharField(max_length=20)
    customer_id = models.CharField(max_length=120)

    class Meta:
        app_label = 'customer_data'

class User(models.Model):
    name = models.CharField(max_length=20)
    user_id = models.CharField(max_length=120)
    age = models.IntegerField()

    class Meta:
        app_label = 'user_data'

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

мигрировать Работает в базе данных по умолчанию по умолчанию, поэтому чтобы синхронизировать изменения в других базах данных, пропустите их в качестве опций в команду:

./manage.py migrate --database=customers_db

Вывод

Этот пост дал вам обзор работы с несколькими базами данных в Django. Вы видели, как добавить более одной базы данных в конфигурацию, как вручную выберите базу данных, которая будет ориентирована на запрос или сохранение операции и как создавать пользовательские маршрутизаторы базы данных. Официальные документы охватывают более подробную информацию о том, как выполнять дополнительные операции, такие как удаление записей или движущихся записей между базами данных. Спасибо за чтение.

Использованная литература:

  1. Django Docs
  2. Django Orm Cookbook

Оригинал: “https://dev.to/vndlovu/how-to-use-django-with-multiple-databases-p20”