tutorial jsonfield python django mongodb postgresql nosql

python - jsonfield - Mezcla de PostgreSQL y MongoDB(como backends de Django)



django mongodb tutorial (3)

Echaré un vistazo a la charla de Disqus de DjangoCan 2010 sobre su arquitectura de escala. Se ejecutan muy posiblemente el sitio web más grande de Django en la parte superior de Postgres. Presentan fragmentos de código simples que muestran cómo iniciar escalas verticales y horizontales utilizando funciones integradas en Django.

Tengo entendido que usan MongoDB para algunos de sus análisis, aunque pensé que no se discutía en esa charla.

Estoy pensando en trasladar el backend de mi sitio a Mongo desde Postgres por razones de rendimiento, pero las partes clave del sitio se basan en los modelos de GeoDjango para calcular las distancias entre los objetos en el mundo real (y así sucesivamente).

¿Sería factible tener la mayor parte del sitio ejecutándose en Mongo, pero esas áreas clave que usan Postgres para el almacenamiento? ¿Es esto doloroso y / o propenso a errores? ¿Hay una solución de Mongo que me falta?

Cualquier luz que pueda arrojar sobre estos asuntos para mí sería muy apreciada.


Desde Django 1.2, puede definir múltiples conexiones de datbase en su settings.py . Luego puede usar enrutadores de base de datos para decirle a Django a qué base de datos ir, de forma transparente para su aplicación.

Descargo de responsabilidad: así es como creo que debería funcionar, nunca he usado MongoDB en Django, ni he probado que mi código realmente funcione. :)

settings.py

DATABASES = { ''default'': { ''ENGINE'': ''django_mongodb_engine'', ''NAME'': ''mydata'', ... } ''geodata'' { ''ENGINE'': ''django.db.backends.postgresql_psycopg2'', ''NAME'': ''geodata'', ... } } DATABASE_ROUTERS = [''path.to.ModelMetaRouter'']

Modelos

A continuación, agregue variables Meta personalizadas a sus geo-tablas, para anular su base de datos. No agregue este atributo a los modelos que se supone que deben ir a la base de datos predeterminada.

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

Enrutador

Y escriba un enrutador de base de datos para dirigir todos los modelos que tengan el conjunto de atributos de meta using a la conexión adecuada:

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


no puede tener ''usar'' en la lista Meta.

aquí hay una solución de trabajo

agregar esto a models.py:

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

crea un router.py en tu carpeta de aplicaciones:

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

Contenido de enrutador.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

Router de referencia en su configuración:

DATABASE_ROUTERS = [''myapp.router.ModelMetaRouter'']