Django как создать базу данных клонов?

postgresql является моей первичной базой данных. Если какой-либо объект создается в моей оригинальной базе данных, то я хочу, чтобы он также сохранил дубликат объекта в моей вторичной базе данных. Я прочитал документацию Django для создания базы данных-клона, но ничего не получилось. Вот мой код:

#replicarouter.py

 class PrimaryReplicaRouter:
    def db_for_read(self, model, **hints):
        """
        Reads go to a randomly-chosen replica.
        """
        return 'primary'

    def db_for_write(self, model, **hints):
        """
        Writes always go to primary.
        """
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the primary/replica pool.
        """
        db_set = {'primary', 'replica_database'}
        if obj1._state.db in db_set:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        All non-auth models end up in this pool.
        """
        return True
 

settings.py

     DATABASES = {
        'default':{},
        'primary': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'my_db_name',
            'USER': 'postgres',
            'PASSWORD': 'my_db_pass',
            'HOST': 'localhost',
            'PORT':5432,
        },

        'replica_database': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'my_db_name',
            'USER': 'root',
            'PASSWORD': '',
            'HOST': 'localhost',
            'PORT': 3306,
        }

        
    }

DATABASE_ROUTERS = ['farhyn.dbrouters.AuthRouter','farhyn.replicarouter.PrimaryReplicaRouter']

Наконец-то я нашел решение. После прочтения документации по нескольким базам данных мы можем использовать несколько баз данных, но не можем хранить объекты-клоны в нашей базе данных. Давайте немного объясним, предположим, что у вас есть две модели учитель и ученик. Вы можете использовать две отдельные базы данных для учителя и ученика, но вы не можете использовать другую базу данных для хранения объектов-клонов вашей модели учителя и ученика. Поэтому здесь мы будем использовать django siganls для хранения объектов-клонов в нашей базе данных replica_database. Сигналы будут срабатывать и создавать объекты-клоны всякий раз, когда в нашей модели будут создаваться какие-либо объекты. Вот мой код:

settings.py

'default': { 
        'NAME': 'primary_database',
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'USER': 'root',
        'PASSWORD': '',
    },
    'replica1_database': {
        'NAME': 'replica1_database',
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'USER': 'root',
        'PASSWORD': '', },

models.py:

from django.db.models.signals import post_save
from django.dispatch import receiver

class Contact(models.Model):
      name = models.CharField(blank=True, null=True, max_length=100)
    
    
@receiver(post_save, sender=Contact, dispatch_uid="clone_objects")
def replica1_databse(sender, instance, created, **kwargs):
    if created: #cerate clone object in our replica1 database
         obj = instance
         obj.save(using='replica1') 
    else: #updating clone object in our replica1 database
         obj = Contact.objects.using('replica1').update(
         name=instance.name)

Здесь я запускаю сигналы для создания и клонирования объектов в моей базе данных replica1_database.

Теперь запустите python manage.py makemigrtions contact и python manage.py migrate contact эти две миграции, примененные в вашей базе данных по умолчанию. Это самый важный шаг ----> Вы должны запустить python manage.py migrate --database=replica1 эту миграцию для вашей базы данных replica1.

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

Вернуться на верх