#23749: Document how to get the database alias in migrations
--------------------------------------+------------------------------------
Reporter: alfredperlstein | Owner:
Type: Cleanup/optimization | Status: new
Component: Documentation | Version: 1.7
Severity: Normal | Resolution:
Keywords: migrations dbrouter | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 1 | UI/UX: 0
--------------------------------------+------------------------------------
Comment (by MarkusH):
{{{#!diff
diff --git a/docs/ref/schema-editor.txt b/docs/ref/schema-editor.txt
index 54dd3bf..c503296 100644
--- a/docs/ref/schema-editor.txt
+++ b/docs/ref/schema-editor.txt
@@ -158,9 +158,9 @@ below.
.. 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.
+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 in turn is useful when doing data migrations for
-:ref:`migrations with multiple database backends <data-migrations-and-
multiple-databases>`.
+This in turn is useful when doing data migrations for :ref:`migrations
with
+multiple database backends <data-migrations-and-multiple-databases>`.
diff --git a/docs/topics/migrations.txt b/docs/topics/migrations.txt
index 746f4d2..a743bf2 100644
--- a/docs/topics/migrations.txt
+++ b/docs/topics/migrations.txt
@@ -472,71 +472,72 @@ backwards will raise an exception.
Data migrations and multiple databases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-One of the challenges that can be encountered is figuring out whether
-or not to run a migration when using multiple databases.
-
-For example, you may want to **only** run a migration against a
-particular database.
-
-In order to do that you can filter inside of your data migration
-by looking at the ``schema_editor.connection.alias`` attribute.
-However it is better to have your ``dbrouter`` leverage the same
-``allow_migrate`` call by making the following method in your
-router::
-
- class MyRouter(object):
-
- def allow_migrate(self, db, model):
- # your typical migration code here
-
- def runpython_ok(self, apps, schema_editor, model):
- db = schema_editor.connection.alias
- if self.allow_migrate(db, model):
- return True
- return False
-
-Then to leverage this in your migrations, do the following::
-
- # -*- coding: utf-8 -*-
- from __future__ import unicode_literals
-
- from django.db import models, migrations
- from myappname.dbrouter import MyRouter
- import sys
-
- def forwards(apps, schema_editor):
- # only run this for the correct databases
- MyModel = apps.get_model("myappname", "MyModel")
- if not MyRouter().runpython_ok(apps, schema_editor, MyModel):
- return
-
- """
- This is a global configuration model so there should be only
- row.
- Get the first one -or- create the initial one.
- Only set the default ports if it has not been set by user
- already.
- """
- try:
- my_model = MyModel.objects.order_by("-id").first()
- except IndexError:
- my_model = MyModel.objects.create()
- if my_model.my_model_ports == "":
- my_model.my_model_ports = "80, 8080, 3128"
- my_model.save()
-
- def backwards(apps, schema_editor):
- pass
-
- class Migration(migrations.Migration):
-
- dependencies = [
- # Dependencies to other migrations
- ]
-
- operations = [
- migrations.RunPython(forwards, backwards),
- ]
+One of the challenges that can be encountered is figuring out whether or
not to
+run a migration when using multiple databases.
+
+For example, you may want to **only** run a migration against a
particular
+database.
+
+In order to do that you can check the connection alias inside a
``RunPython``
+forwards and backwards operation by looking at the
+``schema_editor.connection.alias`` attribute.
+
+ # -*- coding: utf-8 -*-
+ from __future__ import unicode_literals
+
+ from django.db import migrations
+
+ def forwards(apps, schema_editor):
+ if not schema_editor.connection.alias == 'master-db':
+ 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::
+
+ # -*- coding: utf-8 -*-
+ from __future__ import unicode_literals
+
+ from django.db import models, 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
~~~~~~~~~~~~~~~~~~~~~~~~
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/23749#comment:20>
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/073.bef60f126ff6b7e6f6958fc54f39e6ad%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.