multitenant: hook MigrationRecorder::has_table for a speedup (#81814) #78

Open
pducroquet wants to merge 2 commits from wip/81814-speedup-migrations into main
1 changed files with 10 additions and 2 deletions

View File

@ -19,6 +19,7 @@ from django.conf import settings
from django.core.management.commands.migrate import Command as MigrateCommand
from django.db import connection
from django.db.migrations.loader import MigrationLoader
from django.db.migrations.recorder import MigrationRecorder
from django.utils.timezone import localtime
from hobo.multitenant.management.commands import SyncCommon
@ -62,11 +63,11 @@ class MigrateSchemasCommand(SyncCommon):
start_datetime = localtime()
for step, tenant in enumerate(tenants, start=1):
connection.set_tenant(tenant, include_public=False)
applied_migrations = self.get_applied_migrations(app_labels)
applied_migrations = {x for x in self.get_applied_migrations(app_labels)}
if options.get('fake') or options.get('migration_name') or options.get('app_label'):
# never skip migrations if explicit migration actions
# are given.
applied_migrations = []
applied_migrations = set()
if all([x in applied_migrations for x in all_migrations]):
if int(self.options.get('verbosity', 1)) >= 1:
self._notice(
@ -91,16 +92,23 @@ class MigrateSchemasCommand(SyncCommon):
def run_migrations(self, tenant, included_apps, step=1, steps=1):
if int(self.options.get('verbosity', 1)) >= 1:
self._notice('=== Running migrate for tenant %s (%s/%s)' % (tenant.domain_url, step, steps))
# Hook recorder has_table function for a nice speedup
original_has_table = MigrationRecorder.has_table
MigrationRecorder.has_table = lambda x: True
Review

Cette modification doit être conditionnée pour ne pas être faite si on est lancé depuis Tenant.create_schema, je dirai de simplement ne pas le faire si la commande reçoit l'argument schema_name.

Cette modification doit être conditionnée pour ne pas être faite si on est lancé depuis Tenant.create_schema, je dirai de simplement ne pas le faire si la commande reçoit l'argument schema_name.
connection.set_tenant(tenant, include_public=False)
command = MigrateCommand()
command.requires_system_checks = False
command.requires_migrations_checks = False
command.execute(*self.args, **self.options)
connection.set_schema_to_public()
# restore recorder
MigrationRecorder.has_table = original_has_table
def run_migrations_on_schema(self, schema, included_apps):
if int(self.options.get('verbosity', 1)) >= 1:
self._notice('=== Running migrate for schema %s' % schema)
connection.set_schema(schema, include_public=False)
command = MigrateCommand()
command.requires_system_checks = False