When is it required to use schema_editor.connection.alias in a migrations.RunPython method and why?
When using RunPython in a data migration, django advises that you should use schema_editor.connection.alias:
from django.db import migrations
def forwards_func(apps, schema_editor):
# We get the model from the versioned app registry;
# if we directly import it, it'll be the wrong version
Country = apps.get_model("myapp", "Country")
db_alias = schema_editor.connection.alias
Country.objects.using(db_alias).bulk_create([
Country(name="USA", code="us"),
Country(name="France", code="fr"),
])
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.RunPython(forwards_func, reverse_func),
]
Warning
RunPython does not magically alter the connection of the models for you; any model methods you call will go to the default database unless you give them the current database alias (available from
schema_editor.connection.alias, whereschema_editoris the second argument to your function).*
But the docs section that describes data migrations, it doesn't mention the alias at all:
from django.db import migrations
def combine_names(apps, schema_editor):
# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Person = apps.get_model('yourappname', 'Person')
for person in Person.objects.all():
person.name = '%s %s' % (person.first_name, person.last_name)
person.save()
class Migration(migrations.Migration):
dependencies = [
('yourappname', '0001_initial'),
]
operations = [
migrations.RunPython(combine_names),
]