#29564: Executing createsuperuser with non-default database.
-------------------------------------+-------------------------------------
     Reporter:  Oleg Żero            |                    Owner:  nobody
         Type:  Uncategorized        |                   Status:  new
    Component:  Migrations           |                  Version:  2.0
     Severity:  Normal               |               Resolution:
     Keywords:  multiple database    |             Triage Stage:
  router createsuperuser             |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Oleg Żero:

Old description:

> Hello!
>
> I tried to use a different, non-default designated database for storing
> (auth, admin, contenttype, session), named 'users', another one for that
> is application-specific 'application' and 'default' is then used for
> everything else, like this:
>

> {{{
> ...
> DATABASES = {
>     'default':  dj_database_url.parse(os.environ['DATABASE_OPS_URL'],
> conn_max_age=500), # for everything else...
>     'users':     dj_database_url.parse(os.environ['DATABASE_USR_URL'],
> conn_max_age=500), # for auth-stuff
>     'application': dj_database_url.parse(os.environ['DATABSE_APP_URL'],
> conn_max_age=500), # for app
> }
> DATABASE_ROUTERS = ['myapplication.routers.AuthRouter']
> }}}
>
> Following your example [https://docs.djangoproject.com/en/2.0/topics/db
> /multi-db/#topics-db-multi-db-routing],
> I created a router.py, in which I replicated your code.
>
> Then:
> {{{
> $ ./manage.py migrate
> $ ./manage.py migrate --database=users
> $ ./manage.py migrate --database=application
> }}}
> Works fine. I verified the database content, and yes, the tables are
> created in 'users'.
>
> However, when executing:
> {{{
> $ ./manage.py createsuperuser
> }}}
> I get prompted to define the name, but just after I hit enter, I get a
> django.db.utils.ProgrammingError: relation "auth_user" does not exist
> LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM
> "auth_user...
>
> ...and django fails to initialize that user.
> The only way I can get it to work, is when the 'users' database matches
> the 'default' one.
> How do I work around it? Is it a bug?
>
> Thank you very much in advance!

New description:

 Hello!

 I tried to use a different, non-default designated database for storing
 (auth, admin, contenttype, session), named 'users', another one for that
 is application-specific 'application' and 'default' is then used for
 everything else, like this:


 {{{
 ...
 DATABASES = {
     'default':  dj_database_url.parse(os.environ['DATABASE_OPS_URL'],
 conn_max_age=500), # for everything else...
     'users':     dj_database_url.parse(os.environ['DATABASE_USR_URL'],
 conn_max_age=500), # for auth-stuff
     'application': dj_database_url.parse(os.environ['DATABSE_APP_URL'],
 conn_max_age=500), # for app
 }
 DATABASE_ROUTERS = ['myapplication.routers.AuthRouter']
 ...
 }}}

 Following your example [https://docs.djangoproject.com/en/2.0/topics/db
 /multi-db/#topics-db-multi-db-routing],
 I created a router.py, in which I replicated your code.
 However, being aware of the cross-database problem, my routers.py looks
 like this:
 {{{
 class AuthRouter(object):
     auth_related = (
             'auth',
             'admin',
             'contenttypes',
             'sessions',
     )

     def db_for_read(self, model, **hints):
         if model._meta.app_label in self.auth_related:
             return 'users'
         return None

     def db_for_write(self, model, **hints):
         if model._meta.app_label in self.auth_related:
             return 'users'
         return None

     def allow_relation(self, obj1, obj2, **hints):
         if obj1._meta.app_label in self.auth_related or \
            obj2._meta.app_label in self.auth_related:
             return True
         return None

     def allow_migrate(self, db, app_label, model_name=None, **hints):
         if app_label in self.auth_related:
             return db == 'users'
         return None
 }}}

 Then:
 {{{
 $ ./manage.py migrate
 $ ./manage.py migrate --database=users
 $ ./manage.py migrate --database=application
 }}}
 Works fine. I verified the database content, and yes, the tables are
 created in 'users'.

 However, when executing:
 {{{
 $ ./manage.py createsuperuser
 }}}
 I get prompted to define the name, but just after I hit enter, I get a
 django.db.utils.ProgrammingError: relation "auth_user" does not exist
 LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...

 ...and django fails to initialize that user.
 The only way I can get it to work, is when the 'users' database matches
 the 'default' one.
 How do I work around it? Is it a bug?

 Thank you very much in advance!

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29564#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/068.d92072953fa2c7040e962c38abf238bf%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to