2012-07-29 14 views
5

Estoy tratando de fragmentar mi base de datos en django, pero tengo un extraño error en los primeros pasos.enrutador de base de datos django 1.4 - "no se puede importar la conexión de nombre"

Hice un simple enrutador db, que nada dous:

'''file /myproject/myapp/routers.py''' 
class ShardingRouter(object): 

    def db_for_read(self, model, **hints): 
     return 'default' 

    def db_for_write(self, model, **hints): 
     return 'default' 

    def allow_relation(self, obj1, obj2, **hints): 
     return 'default' 

    def allow_syncdb(self, db, model): 
     return 'default' 

he añadido en settings.py:

DATABASE_ROUTERS = ['myproject.myapp.routers.ShardingRouter',] 

estoy recibiendo este error:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__ 
    self.load_middleware() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 45, in load_middleware 
    mod = import_module(mw_module) 
    File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
    File "/hosting/myproject/myproject/middleware.py", line 10, in <module> 
    from django.contrib.sites.models import Site 
    File "/usr/local/lib/python2.7/dist-packages/django/contrib/sites/models.py", line 1, in <module> 
    from django.db import models 
    File "/usr/local/lib/python2.7/dist-packages/django/db/__init__.py", line 16, in <module> 
    router = ConnectionRouter(settings.DATABASE_ROUTERS) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 116, in __init__ 
    raise ImproperlyConfigured('Error importing database router %s: "%s"' % (klass_name, e)) 
ImproperlyConfigured: Error importing database router ShardingRouter: "cannot import name connection" 

¿Qué 'conexión'? Qué significa eso? No encontraste, ¿dónde está el problema ((

Respuesta

6

Es necesario importar connections en su settings.py:

from django.db import connections 

... 
... 

DATABASE_ROUTERS = ['myproject.myapp.routers.ShardingRouter',] 
... 
... 
+2

¡Eso ayudó! Pero funciona solo cuando coloco esta importación después de la declaración 'DATABASES' – Antonio

0

Usted debe echar un vistazo a esta pregunta: Django multi-database routing

Por cierto, como se indicado en the documentation, allow_relation y allow_syncdb debe devolver True, False o None, no un nombre de base de datos.

+0

Cambié los valores devueltos a Ninguno, eso no solucionó el problema. – Antonio

+0

'Enrutamiento de múltiples bases de datos de Django' - en esa pregunta, el tipo tiene otro problema. Debería mover su enrutador de 'models.py' a' routers.py', pero en mi situación el enrutador de db ya está en el archivo separado 'routers.py' – Antonio

0

mi nombre de la aplicación es el blog sincronizado con Alais base de datos usuario1:

DATABASE_ROUTERS=['routers.BlogRouter'] 


DATABASES = { 

    'default': { 

     'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 


     'NAME': 'mupltiple_datab_app1',      # Or path to database file if using sqlite3. 

     'USER': 'root',      # Not used with sqlite3. 

     'PASSWORD': 'admin',     # Not used with sqlite3. 

     'HOST': "",      # Set to empty string for localhost. Not used with sqlite3. 

     'PORT': "",      # Set to empty string for default. Not used with sqlite3. 
    }, 
    'user1':{ 
     'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 

     'NAME': 'mupltiple_datab_app2',      # Or path to database file if using sqlite3. 

     'USER': 'root',      # Not used with sqlite3. 

     'PASSWORD': 'admin',     # Not used with sqlite3. 

     'HOST': "",      # Set to empty string for localhost. Not used with sqlite3. 

     'PORT': "", 


      } 

    , 
    'user2':{ 
      'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 

     'NAME': 'mupltiple_datab_app3',      # Or path to database file if using sqlite3. 

     'USER': 'root',      # Not used with sqlite3. 

     'PASSWORD': 'admin',     # Not used with sqlite3. 

     'HOST':"" ,      # Set to empty string for localhost. Not used with sqlite3. 

     'PORT': "" , 

      } 
} 

estoy seguro de que hay una serie de matices inexploradas de trabajar con múltiples bases de datos de Django, y admito que no he profundizado en el código subyacente de esta funcionalidad, pero por el momento todo parece funcionar según sea necesario. La parte realmente impresionante fue ver las dos aplicaciones en el administrador sin errores.

Cuestiones relacionadas