Fixed #23749 -- Documented how to use the database alias in RunPython.
Thanks Markus Holtermann for review and feedback.
This commit is contained in:
parent
b738178825
commit
db3f7c15cb
|
@ -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
|
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
|
issue a separate ALTER statement for each change, but will not issue ALTERs
|
||||||
where no change is required (as South often did).
|
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>`.
|
||||||
|
|
|
@ -467,6 +467,73 @@ You can pass a second callable to
|
||||||
want executed when migrating backwards. If this callable is omitted, migrating
|
want executed when migrating backwards. If this callable is omitted, migrating
|
||||||
backwards will raise an exception.
|
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
|
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
|
to be able to write your own, see the :doc:`migration operations reference
|
||||||
</ref/migration-operations>`.
|
</ref/migration-operations>`.
|
||||||
|
|
Loading…
Reference in New Issue