[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