2008-11-06 40 views
9

De algún foro llegué a saber que se agrega soporte de base de datos múltiple en Django en el nivel inferior, pero las apis de nivel superior aún no se han agregado.Soporte de base de datos múltiple en django

¿Puede alguien decirme cómo se pueden lograr múltiples conexiones de bases de datos en Django.

¿Alguien tiene alguna idea de cuándo Django admitirá total/oficialmente varias conexiones de bases de datos?

Respuesta

0

creo que tendrá que recurrir a "sql prima" .. cosa un poco ..
vistazo aquí: http://docs.djangoproject.com/en/dev/topics/db/sql/

necesita una "conexión" con su otra base de datos, si nos fijamos en torno django/db/__init__.py la línea 39 (en mi versión ..)

connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)

tratar de tomar desde allí ..
PS Realmente no he intentado esto ni nada ... solo intento apuntar en la dirección general de lo que creo que podría resolver su problema.

3

Si lee algunos de los muchos (muchos ) hilos sobre este tema en django-dev, se verá que lo que se ve sencillo, no lo es. Si elige un caso de uso único, parece fácil, pero tan pronto como comience a generalizar de cualquier manera, comenzará a tener problemas.

Para utilizar el subproceso mencionado anteriormente como ejemplo, cuando dice "múltiples bases de datos", ¿cuál de las siguientes preguntas está hablando?

  • Todos los DB en la misma máquina bajo el mismo motor.
  • Todos los DB en la misma máquina, diferentes motores (p. Ej., MySQL + PostgreSQL)
  • One Master DB con N esclavos de solo lectura en diferentes máquinas.
  • Sharding de tablas en varios servidores de bases de datos.

¿Necesitará:

teclas
  • Exteriores a través de DB
  • JOINs través de las máquinas y/o motores
  • , etc, etc

Uno de los problemas con una mancha ORM como Django es que oculta todos esos detalles desordenados en un buen trabajo de pintura. Para continuar haciendo eso, pero para luego agregar cualquiera de los anteriores, no es fácil (tm).

+0

entiendo que en realidad es un trabajo complicado. Pero entonces django solo se puede usar para aplicaciones web simples, una vez que la aplicación crezca, se vuelve obligatorio dividir datos en múltiples servidores de bases de datos (fragmentación). ¿Cómo un desarrollador puede manejar estos casos? – codebreak

+0

De todos los problemas de múltiples bases de datos, la fragmentación puede ser la aplicación más específica y, por lo tanto, la más difícil de ceder a una solución general. ¿Conoces algún ORM que tenga una solución general a este problema? –

2

Eric Florenzano escribió una muy buena publicación en el blog que le permite un soporte de varias bases de datos en: Easy MultipleDatabase Support for Django.

Comienza con la creación de un nuevo administrador personalizado que le permite especificar la configuración de la base de datos.

+0

Modificar el objeto de configuración global según el ejemplo de Eric no es una tarea segura. Parece que la API de conexión de nivel inferior ha cambiado para permitir que se pasen las configuraciones, lo que la haría segura. –

0

El enfoque de Eric Florenzano funciona bien si todas sus bases de datos usan el mismo motor. Si tiene diferentes motores (Postgres y MSSQL en mi caso), se encontrará con muchos problemas en el código ORM (como models/sql/where.py utilizando la sintaxis SQL de la conexión predeterminada).

Si necesita que esto funcione, debe esperar a que el proyecto MultiDB de Alex Gaynor que está prevista para Django 1.2

9

Si sólo hay múltiples conexiones, se puede hacer algo como esto:

from django.db import load_backend 
myBackend = load_backend('postgresql_psycopg2') # or 'mysql', 'sqlite3', 'oracle' 
myConnection = myBackend.DatabaseWrapper({ 
    'DATABASE_HOST': '192.168.1.1', 
    'DATABASE_NAME': 'my_database', 
    'DATABASE_OPTIONS': {}, 
    'DATABASE_PASSWORD': "", 
    'DATABASE_PORT': "", 
    'DATABASE_USER': "my_user", 
    'TIME_ZONE': "America/New_York",}) 
# Now we can do all the standard raw sql stuff with myConnection. 
myCursor = myConnection.cursor() 
myCursor.execute("SELECT COUNT(1) FROM my_table;") 
myCursor.fetchone() 
+1

Subió como esto es exactamente lo que estaba buscando cuando encontré esta respuesta en Google –

1

múltiples bases de datos para elegir

Siempre necesitamos una nombrado por defecto, los nombres del resto dependen de usted.

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mupltiple_datab_app1',      
     'USER': 'root',      
     'PASSWORD': 'admin',     
     'HOST': "",      
     'PORT': "",      
    }, 
    'user1':{ 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mupltiple_datab_app2',      
     'USER': 'root',      
     'PASSWORD': 'admin',     
     'HOST': "",       
     'PORT': "", 

    }, 
    'user2':{ 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mupltiple_datab_app3',      
     'USER': 'root',      
     'PASSWORD': 'admin',     
     'HOST':"" ,      
     'PORT': "" , 

    } 
} 

para la sincronización de una base de datos en particular

manage.py syncdb --database=user1 
Cuestiones relacionadas