Skip to content

Commit

Permalink
Fixed #23749 -- Documented how to use the database alias in RunPython.
Browse files Browse the repository at this point in the history
Thanks Markus Holtermann for review and feedback.
  • Loading branch information
splbio authored and timgraham committed Jan 3, 2015
1 parent b738178 commit db3f7c1
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
17 changes: 17 additions & 0 deletions docs/ref/schema-editor.txt
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,20 @@ If the database has the ``supports_combined_alters``, Django will try and
do as many of these in a single database call as possible; otherwise, it will
issue a separate ALTER statement for each change, but will not issue ALTERs
where no change is required (as South often did).

Attributes
==========

All attributes should be considered read-only unless stated otherwise.

connection
----------

.. attribute:: SchemaEditor.connection

A connection object to the database. A useful attribute of the connection is
``alias`` which can be used to determine the name of the database being
accessed.

This is useful when doing data migrations for :ref:`migrations with multiple
databases <data-migrations-and-multiple-databases>`.
67 changes: 67 additions & 0 deletions docs/topics/migrations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,73 @@ You can pass a second callable to
want executed when migrating backwards. If this callable is omitted, migrating
backwards will raise an exception.

.. _data-migrations-and-multiple-databases:

Data migrations and multiple databases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When using multiple databases, you may need to figure out whether or not to
run a migration against a particular database. For example, you may want to
**only** run a migration on a particular database.

In order to do that you can check the database connection's alias inside a
``RunPython`` operation by looking at the ``schema_editor.connection.alias``
attribute::

from django.db import migrations

def forwards(apps, schema_editor):
if not schema_editor.connection.alias == 'default':
return
# Your migration code goes here

class Migration(migrations.Migration):

dependencies = [
# Dependencies to other migrations
]

operations = [
migrations.RunPython(forwards),
]

You can also use your database router's ``allow_migrate()`` method, but keep in
mind that the imported router needs to stay around as long as it is referenced
inside a migration:

.. snippet::
:filename: myapp/dbrouters.py

class MyRouter(object):

def allow_migrate(self, db, model):
return db == 'default'

Then, to leverage this in your migrations, do the following::

from django.db import migrations

from myappname.dbrouters import MyRouter

def forwards(apps, schema_editor):
MyModel = apps.get_model("myappname", "MyModel")
if not MyRouter().allow_migrate(schema_editor.connection.alias, MyModel):
return
# Your migration code goes here

class Migration(migrations.Migration):

dependencies = [
# Dependencies to other migrations
]

operations = [
migrations.RunPython(forwards),
]

More advanced migrations
~~~~~~~~~~~~~~~~~~~~~~~~

If you're interested in the more advanced migration operations, or want
to be able to write your own, see the :doc:`migration operations reference
</ref/migration-operations>`.
Expand Down

0 comments on commit db3f7c1

Please sign in to comment.