How do I manage a Non-default Django PostgreSQL database

148 views
Skip to first unread message

Stephen M

unread,
Apr 8, 2015, 8:53:11 PM4/8/15
to django...@googlegroups.com
Also posted to stackoverflow: How do I manage a Non-default Django database
 
 
image
 
 
 
 
 
How do I manage a Non-default Django database
I am having trouble using my non-default database in my Django (v1.8) app. When I try makemigrations and migrate the PostgreSQL database does not get updated. ...
Preview by Yahoo
 


I am having trouble using my non-default database in my Djaango (v1.8) app. When I
try makemigrations and migrate the PostgreSQL database does not get updated.

Here is my Django structure:

    fbrDjangoSite
    |-- db.sqlite3
    |-- manage.py
    |-- fbrDjangoSite
    |   |-- __init__.py
    |   |-- requirements.txt
    |   |-- settings.py
    |   |-- urls.py
    |   |-- wsgi.py
    |-- fbrPostHasteAppV0_1
    |   |-- __init__.py
    |   |-- admin.py
    |   |-- migrations
    |   |-- models.py
    |   |-- router.py
    |   |-- tests.py
    |   |-- urls.py
    |   |-- views.py


# fbrPostHasteAppV0_1/admin.py

    from django.contrib import admin
    from fbrPostHasteAppV0_1.models import MusicianTable   # gvim ../fbrPostHasteAppV0_1/models.py +/MusicianTable
    from fbrPostHasteAppV0_1.models import AlbumTable      # gvim ../fbrPostHasteAppV0_1/models.py +/AlbumTable

    # Register your models here.
    admin.site.register(MusicianTable)
    admin.site.register(AlbumTable)


# fbrPostHasteAppV0_1/models.py

    from django.db import models

    # Define your models/tables here.
    class MusicianTable(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        instrument = models.CharField(max_length=100)

        class Meta:
            managed = True

    class AlbumTable(models.Model):
        artist = models.ForeignKey(MusicianTable)
        name = models.CharField(max_length=100)
        release_date = models.DateField()
        num_stars = models.IntegerField()

        class Meta:
            managed = True

# fbrPostHasteAppV0_1/router.py

    class fbrPostHasteAppV0_1Router(object):
        def db_for_read(self, model, **hints):
            if model._meta.app_label == 'fbrPostHasteAppV0_1':
                return 'fbrPostHasteDbV0_1'
            return None

        def db_for_write(self, model, **hints):
            if model._meta.app_label == 'fbrPostHasteAppV0_1':
                return 'fbrPostHasteDbV0_1'
            return None

        def allow_syncdb(self, db, model):
            if db == 'fbrPostHasteDbV0_1':
                return model._meta.app_label == 'fbrPostHasteAppV0_1'
            elif model._meta.app_label == 'fbrPostHasteAppV0_1':
                return False
            return None


# fbrDjangoSite/settings.py

    # ...
    INSTALLED_APPS = (
        # ...
        'fbrPostHasteAppV0_1',             # v ../fbrPostHasteAppV0_1/__init__.py
    )

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        },
        # ...
        'fbrPostHasteDb': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'fbrPostHasteDbV0_1',
            'USER': 'myuser',
            'PASSWORD': '',
            'HOST': 'myhost.us.overlord.com',
            'PORT': '0000',
        },
    }

    DATABASE_ROUTERS = ['fbrPostHasteAppV0_1.router.fbrPostHasteAppV0_1Router',]


Here is the output when I run the migration commands:

    [fbrDjangoServerV0_1.venv.py] /<3>django/fbrDjangoServerV0_1.venv.py/fbrDjangoSite> python manage.py makemigrations fbrPostHasteAppV0_1 --verbosity 3
        /fobar-tools/pylibs/lib/python/Django-1.8-py2.7.egg/django/db/models/base.py:1497: RemovedInDjango19Warning: Router.allow_syncdb has been deprecated and will stop working in Django 1.9. Rename the method to allow_migrate.
          if not router.allow_migrate(db, cls):
        Did you rename the fbrPostHasteAppV0_1.Musician model to MusicianTable? [y/N] y
        Migrations for 'fbrPostHasteAppV0_1':
          0002_auto_20150408_1653.py:
            - Create model AlbumTable
            - Rename model Musician to MusicianTable
            - Remove field artist from album
            - Delete model Album
            - Add field artist to albumtable
    [fbrDjangoServerV0_1.venv.py] /<3>django/fbrDjangoServerV0_1.venv.py/fbrDjangoSite> python manage.py migrate --verbosity 3 
        /fobar-tools/pylibs/lib/python/Django-1.8-py2.7.egg/django/db/models/base.py:1497: RemovedInDjango19Warning: Router.allow_syncdb has been deprecated and will stop working in Django 1.9. Rename the method to allow_migrate.
          if not router.allow_migrate(db, cls):
        Operations to perform:
          Synchronize unmigrated apps: staticfiles, messages
          Apply all migrations: fbrSimDataV0_2, sessions, admin, polls, auth, contenttypes, fbrPostHasteAppV0_1
        Synchronizing apps without migrations:
        /fobar-tools/pylibs/lib/python/Django-1.8-py2.7.egg/django/db/utils.py:336: RemovedInDjango19Warning: Router.allow_syncdb has been deprecated and will stop working in Django 1.9. Rename the method to allow_migrate.
          return [model for model in models if self.allow_migrate(db, model)]
          Creating tables...
          Installing custom SQL...
          Installing indexes...
        Running migrations:
          Applying fbrPostHasteAppV0_1.0002_auto_20150408_1653.../fobar-tools/pylibs/lib/python/Django-1.8-py2.7.egg/django/db/migrations/operations/base.py:107: RemovedInDjango19Warning: Router.allow_syncdb has been deprecated and will stop working in Django 1.9. Rename the method to allow_migrate.
          router.allow_migrate(connection_alias, model) and
         OK
        /fobar-tools/pylibs/lib/python/Django-1.8-py2.7.egg/django/contrib/auth/management/__init__.py:70: RemovedInDjango19Warning: Router.allow_syncdb has been deprecated and will stop working in Django 1.9. Rename the method to allow_migrate.
          if not router.allow_migrate(using, Permission):
        The following content types are stale and need to be deleted:
            fbrPostHasteAppV0_1 | album
            fbrPostHasteAppV0_1 | musician

But when I look at the dtatbase the "table" has not been added.

    [fbrDjangoServerV0_1.venv.py] /<3>django/fbrDjangoServerV0_1.venv.py/fbrDjangoSite>       psql -h localhost -p 0000 --command "\l" postgres
                                     List of databases
           Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges
        -----------+----------+-----------+---------+-------+-----------------------
         postgres  | myuser   | SQL_ASCII | C       | C     |
         template0 | myuser   | SQL_ASCII | C       | C     | =c/myuser          +
                   |          |           |         |       | myuser=CTc/myuser
         template1 | myuser   | SQL_ASCII | C       | C     | =c/myuser          +
                   |          |           |         |       | myuser=CTc/myuser
         test      | myuser   | SQL_ASCII | C       | C     |
        (4 rows)

I was under the impression that Django could create the table and keep it in
sync whenever I made changes to the model. Is my understanding correct and if
so what am I doing wrong here?


 
Stephen Meckley
Message has been deleted

Stephen M

unread,
Apr 9, 2015, 9:13:06 AM4/9/15
to django...@googlegroups.com
If Django migrations with PostgreSQL is a bit flaky (as suggested by S.O. comment) which backend database is reliably supported by the Django migrations mechanism?

Carl Meyer

unread,
Apr 9, 2015, 11:30:14 AM4/9/15
to django...@googlegroups.com
The premise is false. Postgres is almost certainly the best-supported
database for Django migrations.

I'm not entirely sure what's going on in your example, but the issue is
most likely related to multiple-databases, not related to Postgres. Did
you read the documentation at
http://django.readthedocs.org/en/latest/topics/db/multi-db.html#synchronizing-your-databases
(really you should carefully read that whole page if you're using
multiple databases)? Did you use the `--database` option to the
`migrate` command?

Carl

signature.asc

Stephen M

unread,
Apr 9, 2015, 1:34:11 PM4/9/15
to django...@googlegroups.com
# UPDATE

One of my issues is that my router code was based on and older version of
Django. I am not sure if this is exactly correct now but it closely resembles


    class fbrPostHasteAppV0_1Router(object):
        def db_for_read(self, model, **hints):
            if model._meta.app_label == 'fbrPostHasteAppV0_1':
                return 'fbrPostHasteDbV0_1'
            return None

        def db_for_write(self, model, **hints):
            if model._meta.app_label == 'fbrPostHasteAppV0_1':
                return 'fbrPostHasteDbV0_1'
            return None

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

        def allow_migrate(self, db, app_label, model=None, **hints):
            if app_label == 'fbrPostHasteAppV0_1':
                return db == 'fbrPostHasteDbV0_1'
            return None

The other issue is that I was not calling migrate with --database:

     python manage.py migrate --database=fbrPostHasteDb

But now I am getting another error:

    django.db.utils.OperationalError: FATAL:  database "fbrPostHasteDbV0_1" does not exist

Continuing to figure out what else I messed up...

Reply all
Reply to author
Forward
0 new messages