Opened 11 years ago

Closed 11 years ago

#20704 closed Bug (worksforme)

DATABASE_ROUTERS : ImproperlyConfigured "cannot import name connection"

Reported by: artscoop Owned by: nobody
Component: Database layer (models, ORM) Version: 1.5
Severity: Normal Keywords: router
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

This bug occurs also on other versions of Django.
I have a Django project which usually works well.
Today I tried to introduce the use of another database. (one is PostgreSQL, the new one is SQLite)

I've setup my settings.py as follows :

DATABASE_ROUTERS = ['engine.db.routers.custom.Router',]

The path to the router is fine, because changing it to a non-existing one raises a correct error. The router inherits from object, and defines the 4 functions shown in the Django documentation. The
allow_relation and allow_syncdb members return True (tried with None), db_for_write and db_for_read return a database name or None.
I have properly defined my DATABASE setting.

However, trying to syncdb throws

  File "/home/artscoop/virtualenv/project/lib/python2.7/site-packages/django/db/__init__.py", line 16, in <module>
    router = ConnectionRouter(settings.DATABASE_ROUTERS)
  File "/home/artscoop/virtualenv/project/lib/python2.7/site-packages/django/db/utils.py", line 117, in __init__
    raise ImproperlyConfigured('Error importing database router %s: "%s"' % (klass_name, e))
django.core.exceptions.ImproperlyConfigured: Error importing database router Router: "cannot import name connection"

No answer in any site could resolve this problem.
The dubious advice to add from django.db import connections leads to another exception

  File "/home/steve/virtualenv/project/lib/python2.7/site-packages/django/db/backends/dummy/base.py", line 15, in complain
    raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

Change History (7)

comment:1 by artscoop, 11 years ago

I have found that moving the router to an app which has no models.py (or is not in INSTALLED_APPS) fixes everything. But the problem with importing from another location is still a bug which is at least not documented.

Last edited 11 years ago by artscoop (previous) (diff)

comment:2 by Aymeric Augustin, 11 years ago

Looks like a circular import.

comment:3 by Simon Charette, 11 years ago

@artscoop what are you importing in your routers module?

comment:4 by Claude Paroz, 11 years ago

This might have been fixed by commit [6a6bb168be90594a18]. To check this, it would be nice if you could test with the current 1.6beta.

comment:5 by artscoop, 11 years ago

The routers.py module does not import anything.
Only has

# coding: utf-8
from __future__ import absolute_import

comment:6 by artscoop, 11 years ago

The behaviour of routers seems correct in @1.6b1 and @stable/1.6.x though.

Last edited 11 years ago by artscoop (previous) (diff)

comment:7 by Claude Paroz, 11 years ago

Resolution: worksforme
Status: newclosed

Thanks for testing on latest code, and I'm happy this is fixed there.

I think you should be able to temporarily workaround the problem by moving your custom Router class in a different path. The current circular import issue may be caused by any __init__.py along the path (i.e. engine/__init__.py, engine/db/__init__.py, etc.).

I really doubt that the fix will be backported in 1.5, therefore closing the ticket.

Note: See TracTickets for help on using tickets.
Back to Top