[Django]-Django migrations with multiple databases

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() returns False, any migration operations for the model_name will be silently skipped when running migrate on the db.

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) ]

👤pymen

Leave a comment