[pyar] [Django] Conectar a multiples DB's segun parámetro GET

Esteban Castro ecastroborsani en gmail.com
Vie Jun 6 21:22:50 ART 2014


En settings configuras las distintas bases de datos que tengas:

DATABASES = {
    'default': {
        'NAME': 'bd_cliente',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 'my_password'
    },
    'db_configuracion': {
        'NAME': 'db_configuracion',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 'my_password'
    },
    'juan': {
        'NAME': 'bd_cliente_juan',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 'my_password'
    },
    'pedro': {
        'NAME': 'bd_cliente_pedro',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 'my_password'
    }}


Vas a crear una app configuracion que funcione solo con la base
db_configuracion:


class ConfigRouter(object):
    """
    Un router que controla todas las operaciones de la base
    sobre los modelos de la app configuracion    """
    def db_for_read(self, model, **hints):
        """        Attempts to read auth models go to auth_db.        """
        if model._meta.app_label == 'configuracion':
            return 'db_configuracion'
        return None

    def db_for_write(self, model, **hints):
        """        Attempts to write auth models go to auth_db.        """
        if model._meta.app_label == 'configuracion':
            return 'db_configuracion'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """        Allow relations if a model in the auth app is
involved.        """
        if obj1._meta.app_label == 'configuracion' or \
           obj2._meta.app_label == 'configuracion':
           return True
        return None

    def allow_syncdb(self, db, model):
        """        Make sure the auth app only appears in the
'auth_db'        database.        """
        if db == 'db_configuracion':
            return model._meta.app_label == 'configuracion'
        elif model._meta.app_label == 'configuracion':
            return False
        return None


Agregas el router en settings:

DATABASE_ROUTERS = ['path.to.ConfigRouter', ]




En tu view:


def consulta_cuotas(request, cliente_id):
    # En lugar de usar request.GET.get("id", None) estoy usando cliente_id
    # que te valida que sea un entero en urls.py

    # Fixme: retornar Http404 si no existe
    bd = ConfiguracionModel.objects.get(cliente_id=cliente_id)

    # Asumiendo que "nombre" es el campo con el nombre de la bd del cliente
    mi_modelo_todo = MiModelo.objects.using(bd.nombre).all()
    return render(request, "app/template.html", {"resultados": mi_modelo_todo,
})



Seria algo asi probablemente.

Docs: https://docs.djangoproject.com/en/dev/topics/db/multi-db/


El 6 de junio de 2014, 19:43, Juan Manuel <jmjacquet en gmail.com> escribió:

> Gente les tiro una inquietud que tengo a ver que opinan y/o  si se les
> ocurre algo...
> Tengo un sitio corriendo en PHP y varias bases de datos (iguales en
> estructura) cada una con sus datos (esto es porque cada DB pertenece a un
> cliente diferente, por cuestiones de espacio deben mantenerse separadas) y
> otra que tiene la configuracion_general de los parametros de todas las
> demas (configura css del sitio por ej).
> Ahora, el sistema en PHP, conecta a cada base de datos dependiento el
> parametro GET que se le pasa a la página, esto es por ejemplo:
>         www.mipagina.com.ar/consultacuotas.php?id=666
> (donde 666 es un parametro en la bd de configuracion que me dá el nombre
> de la DB a conectar )
> Espero se haya entendido:
> 1) Pongo la direccion
> 2) Parametro GET[id]=666 busca en db_configuracion y me devuelve por
> ejemplo DB1
> 3) conectar a DB1 y utilizar el sistema normalmente
>
> Como lo harían en Django?? Buscando en MultipleDB's no me brinda la
> solución....
> Podría hacer una aplicacion que conecte a la base de configuracion y
> traiga los datos segun el id... pero después? Como levantaría la aplicación
> original ya apuntando a la base obtenida? (según entiendo no se puede tocar
> el settings.py  una vez levantado)
>
> --
> Saludos, Juan Manuel.
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140606/6467e759/attachment-0001.html>


More information about the pyar mailing list