diff --git a/django_tenants/migration_executors/base.py b/django_tenants/migration_executors/base.py
index <HASH>..<HASH> 100644
--- a/django_tenants/migration_executors/base.py
+++ b/django_tenants/migration_executors/base.py
@@ -3,6 +3,7 @@ import sys
 from django.db import transaction
 
 from django.core.management.commands.migrate import Command as MigrateCommand
+from django.db.migrations.recorder import MigrationRecorder
 
 from django_tenants.signals import schema_migrated, schema_migrate_message
 from django_tenants.utils import get_public_schema_name, get_tenant_database_alias
@@ -38,6 +39,11 @@ def run_migrations(args, options, executor_codename, schema_name, tenant_type=''
     connection = connections[options.get('database', get_tenant_database_alias())]
     connection.set_schema(schema_name, tenant_type=tenant_type)
 
+    # ensure that django_migrations table is created in the schema before migrations run, otherwise the migration
+    # table in the public schema gets picked and no migrations are applied
+    migration_recorder = MigrationRecorder(connection)
+    migration_recorder.ensure_schema()
+
     stdout = OutputWrapper(sys.stdout)
     stdout.style_func = style_func
     stderr = OutputWrapper(sys.stderr)
Ensure django_migrations table is created in a schema before migrations begin