summaryrefslogtreecommitdiff
path: root/django/db/backends/mysql/introspection.py
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes.ljungberg@gmail.com>2021-02-06 20:45:54 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-02-12 21:11:04 +0100
commitc60b9e6640c44597319069bcb10f8d604cb5fe47 (patch)
treeeae00c637292cba6a17419683dde98af23de64ed /django/db/backends/mysql/introspection.py
parent694deff82f86e025561dfa724425f67e2ff7cbb7 (diff)
downloaddjango-c60b9e6640c44597319069bcb10f8d604cb5fe47.tar.gz
Simplified introspection of constraints on MySQL.
Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'django/db/backends/mysql/introspection.py')
-rw-r--r--django/db/backends/mysql/introspection.py31
1 files changed, 11 insertions, 20 deletions
diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py
index 649df5c6d9..346765e30a 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