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.
Я думаю, что это также хорошая идея хранить резервную копию базы данных, чтобы избежать любой непредвиденной ситуации, например, падения сервера.