Смешивание PostgreSQL и MongoDB (в качестве бэкэнда Django) - PullRequest
13 голосов
/ 21 апреля 2011

Я думаю о переносе серверной части моего сайта в Mongo из Postgres по соображениям производительности, но ключевые части сайта полагаются на модели GeoDjango для расчета расстояний между объектами в реальном мире (и т. Д.)

Возможно ли, чтобы большая часть сайта работала в Монго, но в тех ключевых областях, где Postgres используется для хранения? Это болезненно и / или подвержено ошибкам? Я пропускаю полностью монгольское решение?

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

Ответы [ 3 ]

9 голосов
/ 22 апреля 2011

Начиная с Django 1.2, вы можете определять несколько соединений базы данных в вашем settings.py. Затем вы можете использовать маршрутизаторы базы данных , чтобы сообщить Django, к какой базе данных перейти, прозрачно для вашего приложения.

Отказ от ответственности: это то, как я думаю, что должно работать, я никогда не использовал MongoDB в Django и не проверял, что мой код действительно работает. :)

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': 'mydata',
        ...
    }
    'geodata' {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'geodata',
        ...
    }
}

DATABASE_ROUTERS = ['path.to.ModelMetaRouter']

Модель

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

class SomeGeoModel(models.Model):
    ...
    class Meta:
        using = 'geodata'

База данных маршрутизатора

И запишите маршрутизатор базы данных, чтобы направить все модели, у которых установлен мета-атрибут using, к соответствующему соединению:

class ModelMetaRouter(object):
    def db_for_read(self, model, **hints):
        return getattr(model._meta, 'using', None)

    def db_for_write(self, model, **hints):
        return getattr(model._meta, 'using', None)

    def allow_relation(self, obj1, obj2, **hints):
        # only allow relations within a single database
        if getattr(obj1._meta, 'using', None) == getattr(obj2._meta, 'using', None):
            return True
        return None

    def allow_syncdb(self, db, model):
        if db == getattr(model._meta, 'using', 'default'):
            return True
        return None
2 голосов
/ 03 мая 2015

вы не можете иметь «использование» в списке мета.

вот рабочее решение

добавьте это в models.py:

 import django.db.models.options as options
 options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('in_db',)

создайте router.py в папке ваших приложений:

myapp folder content:
   models.py
   router.py
   ...

Содержимое router.py:

class ModelMetaRouter(object):
    def db_for_read(self, model, **hints):

        db = getattr(model._meta, 'in_db', None)   # use default database for models that dont have 'in_db'
        if db:
            return db
        else:
            return 'default'

    def db_for_write(self, model, **hints):
        db = getattr(model._meta, 'in_db', None)
        if db:
            return db
        else:
            return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        # only allow relations within a single database
        if getattr(obj1._meta, 'in_db', None) == getattr(obj2._meta, 'in_db', None):
            return True
        return None

    def allow_syncdb(self, db, model):
        if db == getattr(model._meta, 'in_db', 'default'):
            return True
        return None

Ссылочный роутер в ваших настройках:

   DATABASE_ROUTERS = ['myapp.router.ModelMetaRouter']
1 голос
/ 22 апреля 2011

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

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

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