混合PostgreSQL和MongoDB(作为Django后端)

Ali*_*air 13 python django postgresql mongodb nosql

出于性能原因,我正考虑将我的网站的后端从Postgres转移到Mongo,但网站的关键部分依赖于GeoDjango模型来计算现实世界中对象之间的距离(等等).

让大部分网站在Mongo上运行但使用Postgres进行存储的关键区域是否可行?这是痛苦和/或容易出错吗?我缺少一个全蒙哥解决方案吗?

你能为我解决这些问题的任何亮点都会非常感激.

int*_*tgr 9

从Django 1.2开始,您可以在您的数据库定义多个数据库连接settings.py.然后,您可以使用数据库路由器告诉Django哪个数据库可以透明地传输给您的应用程序.

免责声明:这就是我认为它应该工作的方式,我从来没有在Django中使用过MongoDB,也没有测试过我的代码实际上是否正常工作.:)

settings.py

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

DATABASE_ROUTERS = ['path.to.ModelMetaRouter']
Run Code Online (Sandbox Code Playgroud)

楷模

然后将自定义Meta变量添加到地理表中,以覆盖其数据库.不要将此属性添加到应该转到默认数据库的模型.

class SomeGeoModel(models.Model):
    ...
    class Meta:
        using = 'geodata'
Run Code Online (Sandbox Code Playgroud)

数据库路由器

并编写一个数据库路由器,将具有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
Run Code Online (Sandbox Code Playgroud)