From db3f7c15cbf4c9025e83065d1302d0e61d570331 Mon Sep 17 00:00:00 2001 From: Alfred Perlstein Date: Wed, 31 Dec 2014 19:16:51 -0800 Subject: [PATCH] Fixed #23749 -- Documented how to use the database alias in RunPython. Thanks Markus Holtermann for review and feedback. --- docs/ref/schema-editor.txt | 17 ++++++++++ docs/topics/migrations.txt | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/docs/ref/schema-editor.txt b/docs/ref/schema-editor.txt index e4d3fa01c0..94456d060e 100644 --- a/docs/ref/schema-editor.txt +++ b/docs/ref/schema-editor.txt @@ -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 `. diff --git a/docs/topics/migrations.txt b/docs/topics/migrations.txt index 24cc36650e..60f193b221 100644 --- a/docs/topics/migrations.txt +++ b/docs/topics/migrations.txt @@ -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 `.