Made MigrationRecorder cache has_table() result if django_migrations table exists.

This commit is contained in:
Tom Forbes 2023-05-23 18:05:31 +01:00 committed by Mariusz Felisiak
parent 9d756afb07
commit ea8cbca579
2 changed files with 19 additions and 1 deletions

View File

@ -47,6 +47,7 @@ class MigrationRecorder:
def __init__(self, connection):
self.connection = connection
self._has_table = False
@property
def migration_qs(self):
@ -54,9 +55,16 @@ class MigrationRecorder:
def has_table(self):
"""Return True if the django_migrations table exists."""
# If the migrations table has already been confirmed to exist, don't
# recheck it's existence.
if self._has_table:
return True
# It hasn't been confirmed to exist, recheck.
with self.connection.cursor() as cursor:
tables = self.connection.introspection.table_names(cursor)
return self.Migration._meta.db_table in tables
self._has_table = self.Migration._meta.db_table in tables
return self._has_table
def ensure_schema(self):
"""Ensure the table exists and has the correct schema."""

View File

@ -48,6 +48,16 @@ class RecorderTests(TestCase):
set(),
)
def test_has_table_cached(self):
"""
The has_table() method caches a positive result and not continually
query for the existence of the migrations table.
"""
recorder = MigrationRecorder(connection)
with self.assertNumQueries(1):
self.assertEqual(recorder.has_table(), True)
self.assertEqual(recorder.has_table(), True)
class LoaderTests(TestCase):
"""