40
You have to run migrate
once for each database, specifying the target with --database
. Each time it will consult your router to see which migrations to actually perform on that database.
I’m guessing it was designed this way to favor explicitness over implicitness. For example, your workflow might require you to migrate the different databases at different times.
Note, though, that you won’t be able to tell from the output which migrations were actually performed, since:
If
allow_migrate()
returnsFalse
, any migration operations for themodel_name
will be silently skipped when runningmigrate
on thedb
.
1
Using these nice helpers you can run Python/SQL migrations on specific Database
[Helpers]
from django.db.migrations import RunPython, RunSQL
def run_python_specific_db_migration(migration_func, use_db):
"""calls RunPython command only for specific database """
return RunPython(migration_func, hints={'use_db': use_db})
def run_sql_specific_db_migration(sql_commands, use_db):
"""Runs one or list of sql commands only on specific database """
return RunSQL(sql_commands, hints={'use_db': use_db})
# ** Your specific db_helpers for your DB_KEY **
def run_sql_your_db_migration(sql_commands):
return run_sql_specific_db_migration(sql_commands, use_db=DB_KEY)
def run_python_your_db_migration(migration_func):
return run_python_specific_db_migration(migration_func, use_db=DB_KEY)
[Usage]
def data_migration(apps, schema_editor):
...your data migration logic..better to wrap with @atomic...
class Migration(migrations.Migration):
operations = [ run_python_your_db_migration(data_migration) ]
- [Django]-Running ./manage.py migrate during Heroku deployment
- [Django]-Getting Values of QuerySet in Django
- [Django]-How to access Enum types in Django templates
Source:stackexchange.com