From 560ff988dd6cff40381408c62494ca3eb9804f32 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Sat, 13 Nov 2021 19:27:15 -0500 Subject: [PATCH] Refs #33288 -- Removed SQLite's DatabaseIntrospection._get_foreign_key_constraints(). The get_relations() method returns the exact same data in a more generic format. --- django/db/backends/sqlite3/introspection.py | 29 +++++++++------------ django/db/backends/sqlite3/schema.py | 5 ++-- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py index 7c5c159b64..81884a7951 100644 --- a/django/db/backends/sqlite3/introspection.py +++ b/django/db/backends/sqlite3/introspection.py @@ -137,22 +137,6 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): return name return None - def _get_foreign_key_constraints(self, cursor, table_name): - constraints = {} - cursor.execute('PRAGMA foreign_key_list(%s)' % self.connection.ops.quote_name(table_name)) - for row in cursor.fetchall(): - # Remaining on_update/on_delete/match values are of no interest. - id_, _, table, from_, to = row[:5] - constraints['fk_%d' % id_] = { - 'columns': [from_], - 'primary_key': False, - 'unique': False, - 'foreign_key': (table, to), - 'check': False, - 'index': False, - } - return constraints - def _parse_column_or_constraint_definition(self, tokens, columns): token = None is_constraint_definition = None @@ -349,7 +333,18 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): "check": False, "index": False, } - constraints.update(self._get_foreign_key_constraints(cursor, table_name)) + relations = enumerate(self.get_relations(cursor, table_name).items()) + constraints.update({ + f'fk_{index}': { + 'columns': [column_name], + 'primary_key': False, + 'unique': False, + 'foreign_key': (ref_table_name, ref_column_name), + 'check': False, + 'index': False, + } + for index, (column_name, (ref_column_name, ref_table_name)) in relations + }) return constraints def _get_index_columns_orders(self, sql): diff --git a/django/db/backends/sqlite3/schema.py b/django/db/backends/sqlite3/schema.py index f0c81c123b..db60fd4615 100644 --- a/django/db/backends/sqlite3/schema.py +++ b/django/db/backends/sqlite3/schema.py @@ -75,9 +75,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): for other_table in self.connection.introspection.get_table_list(cursor): if ignore_self and other_table.name == table_name: continue - constraints = self.connection.introspection._get_foreign_key_constraints(cursor, other_table.name) - for constraint in constraints.values(): - constraint_table, constraint_column = constraint['foreign_key'] + relations = self.connection.introspection.get_relations(cursor, other_table.name) + for constraint_column, constraint_table in relations.values(): if (constraint_table == table_name and (column_name is None or constraint_column == column_name)): return True