multitenant: hook MigrationRecorder::has_table for a speedup (#81814) #78
|
@ -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
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue
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.