2009-04-22 9 views
6

Lo pregunté en el grupo de usuarios sin respuesta, así que pensé que lo intentaría aquí. Estoy tratando de configurar un administrador personalizado para conectarme a otra base de datos en el mismo servidor que mi conexión mysql predeterminada. He intentado siguiendo los ejemplos here y here pero no he tenido suerte. Obtengo una tupla vacía al devolver MyCustomModel.objects.all().Múltiples bases de datos en Django 1.0.2 con administrador personalizado

Esto es lo que tengo en manager.py

from django.db import models 
from django.db.backends.mysql.base import DatabaseWrapper 
from django.conf import settings 
class CustomManager(models.Manager): 
    """ 
    This Manager lets you set the DATABASE_NAME on a per-model basis. 
    """ 
    def __init__(self, database_name, *args, **kwargs): 
     models.Manager.__init__(self, *args, **kwargs) 
     self.database_name = database_name 
    def get_query_set(self): 
     qs = models.Manager.get_query_set(self) 
     qs.query.connection = self.get_db_wrapper() 
     return qs 
    def get_db_wrapper(self): 
     # Monkeypatch the settings file. This is not thread-safe! 
     old_db_name = settings.DATABASE_NAME 
     settings.DATABASE_NAME = self.database_name 
     wrapper = DatabaseWrapper() 
     wrapper._cursor(settings) 
     settings.DATABASE_NAME = old_db_name 
     return wrapper 

y esto es lo que tengo en models.py:

from django.db import models 
from myproject.myapp.manager import CustomManager 
class MyCustomModel(models.Model): 
    field1 = models.CharField(max_length=765) 
    attribute = models.CharField(max_length=765) 
    objects = CustomManager('custom_database_name') 
    class Meta: 
     abstract = True 

Pero si me quedo MyCustomModel.objects.all() Puedo obtener una lista vacía.

soy bastante nuevo en esto así que no estoy seguro de si esto funciona con 1.0.2, voy a mirar en el código Manager para ver si puedo averiguar hacia fuera, pero sólo me pregunto si yo Estoy haciendo algo mal aquí.

ACTUALIZACIÓN: Esta ahora en Django tronco y será parte de la versión 1.2 http://docs.djangoproject.com/en/dev/topics/db/multi-db/

+0

Esto viola algunas de las características esenciales de Django. La conexión de base de datos única está en su módulo de configuración. ¿Qué estás realmente tratando de hacer? Deberías considerar otros enfoques en lugar de romper a Django. –

+0

Si miras los ejemplos que trato de usar, uno es de Adrian. Tengo una solución alternativa donde utilizo un módulo auxiliar y simplemente anulo la función de guardar en el modelo, pero esto es un poco complicado y no obtengo ningún beneficio de django. Si tiene alguna sugerencia sobre cómo agregar compatibilidad con múltiples bases de datos a una aplicación, por favor avíseme. –

+0

¿Puedes ser un poco más paciente? Hay un proyecto GSOC en marcha en este momento que agrega soporte de múltiples bases de datos a Django. – ironfroggy

Respuesta

4

Es posible que desee hablar con Alex Gaynor ya que es la adición de apoyo y su MultiDB vinculado para su posible lanzamiento en Django 1.2. Estoy seguro de que agradecería los comentarios y aportes de aquellos que van a usar MultiDB. Hay discusiones al respecto en la lista de mantenimiento de django-developers. Su rama MultiDB puede incluso ser utilizable, no estoy seguro.

Como supongo que probablemente no pueda esperar y si la rama MultiDB no se puede utilizar, estas son sus opciones.

  • Siga Eric Flows method, teniendo en cuenta que no es compatible y el nuevo lanzamiento de Django puede romperlo. Además, algunos comentarios sugieren que es already been broken. Esto va a ser hacky.
  • Su otra opción sería utilizar un método de acceso a bases de datos totalmente diferente para una de sus bases de datos. Quizás SQLAlchemy para uno y luego Django ORM. Supongo que uno es más centrado en Django y el otro es una base de datos heredada.

Resumir. Creo que piratear MultiDB en Django es probablemente la forma incorrecta de hacerlo, a menos que estés preparado para continuar con tus ataques más tarde. Por lo tanto, creo que otro ORM o acceso a la base de datos le daría la ruta más limpia ya que entonces no saldrá con las funciones compatibles y al final del día, todo es solo Python.

+1

Parece que esto se ha comprometido con trunk ahora y también tiene documentos disponibles http://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

+0

Sí. Seguro que tiene y es increíble: D –

0

Esto probablemente ISN t the answer your looking for, but it s probablemente mejor si se mueve todo lo que necesita en la base de datos.

+0

Gracias spence, esa no es realmente una opción porque quiero acceder a los datos de otras aplicaciones como freeradius. –

1

Mi empresa ha tenido éxito utilizando múltiples bases de datos siguiendo muy de cerca esta entrada del blog: http://www.eflorenzano.com/blog/post/easy-multi-database-support-django/

+0

Gracias Bluu Creo que vi esto antes, pero no estoy seguro de si lo probé o no. Mi aplicación está trabajando con algunos métodos de ayuda que tienen su propia conexión mysql, así que tendré que esperar a v2, supongo. –

Cuestiones relacionadas