Django несколько баз данных - одна не всегда доступна - PullRequest
5 голосов
/ 09 февраля 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 марта 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.

3 голосов
/ 10 февраля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...