From c60b9e6640c44597319069bcb10f8d604cb5fe47 Mon Sep 17 00:00:00 2001 From: Hannes Ljungberg Date: Sat, 6 Feb 2021 20:45:54 +0100 Subject: [PATCH] Simplified introspection of constraints on MySQL. Co-authored-by: Mariusz Felisiak --- django/db/backends/mysql/introspection.py | 31 ++++++++--------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py index 649df5c6d99..346765e30ad 100644 --- a/django/db/backends/mysql/introspection.py +++ b/django/db/backends/mysql/introspection.py @@ -211,20 +211,26 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): # Get the actual constraint names and columns name_query = """ SELECT kc.`constraint_name`, kc.`column_name`, - kc.`referenced_table_name`, kc.`referenced_column_name` - FROM information_schema.key_column_usage AS kc + kc.`referenced_table_name`, kc.`referenced_column_name`, + c.`constraint_type` + FROM + information_schema.key_column_usage AS kc, + information_schema.table_constraints AS c WHERE kc.table_schema = DATABASE() AND + c.table_schema = kc.table_schema AND + c.constraint_name = kc.constraint_name AND + c.constraint_type != 'CHECK' AND kc.table_name = %s ORDER BY kc.`ordinal_position` """ cursor.execute(name_query, [table_name]) - for constraint, column, ref_table, ref_column in cursor.fetchall(): + for constraint, column, ref_table, ref_column, kind in cursor.fetchall(): if constraint not in constraints: constraints[constraint] = { 'columns': OrderedSet(), - 'primary_key': False, - 'unique': False, + 'primary_key': kind == 'PRIMARY KEY', + 'unique': kind in {'PRIMARY KEY', 'UNIQUE'}, 'index': False, 'check': False, 'foreign_key': (ref_table, ref_column) if ref_column else None, @@ -232,21 +238,6 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): if self.connection.features.supports_index_column_ordering: constraints[constraint]['orders'] = [] constraints[constraint]['columns'].add(column) - # Now get the constraint types - type_query = """ - SELECT c.constraint_name, c.constraint_type - FROM information_schema.table_constraints AS c - WHERE - c.table_schema = DATABASE() AND - c.table_name = %s - """ - cursor.execute(type_query, [table_name]) - for constraint, kind in cursor.fetchall(): - if kind.lower() == "primary key": - constraints[constraint]['primary_key'] = True - constraints[constraint]['unique'] = True - elif kind.lower() == "unique": - constraints[constraint]['unique'] = True # Add check constraints. if self.connection.features.can_introspect_check_constraints: unnamed_constraints_index = 0