Несколько баз данных Django - одна не всегда доступна

Я разрабатываю приложение Django, которое будет использовать несколько серверных баз данных. Я хотел бы поместить базу данных sqlite на машину, на которой запущено приложение django, и синхронизировать ее с удаленной базой данных mysql. Сложность заключается в том, что эта машина, на которой запущено приложение, не всегда будет иметь подключение к Интернету, поэтому база данных mysql не всегда доступна. Приложение будет запущено на нескольких машинах, каждая со своей собственной локальной базой данных sqlite, но все они будут использовать одну и ту же удаленную базу данных mysql.

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

Можно ли это сделать с помощью маршрутизаторов базы данных или мне нужно вручную реализовать это с каждым оператором базы данных?

Примечание о ПК: не имеет прямого отношения, но обязательно спросит. Первичный ключ будет сгенерирован локально на каждой машине. В БД mysql будет поле для этого ключа и поле с уникальным идентификатором для каждого экземпляра приложения, что вместе даст уникальный ключ.


person AgDude    schedule 09.02.2011    source источник


Ответы (2)


Предположим, у вас есть модель под названием «Блог», тогда вы можете использовать следующее для ее локального и удаленного хранения (при условии, что вы настроили доступ к удаленной базе данных).

blog = Blog('test') 
blog.save() #Assuming that sqlite is the default db
try:
    blog.save(using='mysql')
except NoInternetConnection:
    pass

Убедитесь, что вы определили и настроили «mysql» в settings.py и что вы обрабатываете случаи, когда нет подключения к Интернету.

Боковое примечание: я не совсем уверен, почему вы на самом деле хотите это сделать. Если это для целей резервного копирования, я бы использовал стандартные процедуры резервного копирования. Для получения дополнительной информации об использовании нескольких баз данных см.: http://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-raw-cursors-with-multiple-databases

person DrDee    schedule 09.02.2011
comment
Спасибо за ответ. Это хорошее простое решение. Я напишу функцию, которая будет использовать этот формат для любой модели. В ответ на ваше примечание у меня будет несколько приложений, работающих локально на киосках, которые не имеют надежного подключения к Интернету. Затем мне нужно собрать данные со всех машин на веб-сервер. - person AgDude; 11.02.2011
comment
Пожалуйста, если вам понравился ответ, и он решил вашу проблему, можете ли вы выбрать это в качестве решения? - person DrDee; 17.02.2011

Я взял код DrDee и прикрепил его к сигналу post_save (+1 за помощь).

@receiver(models.signals.post_save) #new signal decorator in Django 1.3
def save_to_remote(sender,instance,using,**kwargs):
    if using == 'default' and instance.__module__ == 'mymodel.myapp.models':
        try:
            instance.save(using='remote')
        except:
            pending_instance=Pending_Remote(
                                            pk_default=instance.pk,
                                            model_default=instance.__class__.__name__
                                            )
            pending_instance.save()

При этом также сохраняется запись о том, что не было сохранено в удаленной базе данных. Обратите внимание, что модель Pending_Remote не должна находиться в 'myapp'.

person AgDude    schedule 19.03.2011
comment
если кто-то может сделать подобное приложение для django и postgres, это будет здорово. - person Martins; 12.10.2018