summaryrefslogtreecommitdiff
path: root/django/db/backends/mysql/introspection.py
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2019-07-14 01:24:35 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-07-19 11:05:06 +0200
commit1fc2c70f7613e014a31771afa537439b28dd35fb (patch)
treedae8ebfe89e687edb518bd6031d89f9c47f774c9 /django/db/backends/mysql/introspection.py
parent7f612eda80db1c1c8e502aced54c2062080eae46 (diff)
downloaddjango-1fc2c70f7613e014a31771afa537439b28dd35fb.tar.gz
Fixed #30593 -- Added support for check constraints on MariaDB 10.2+.
Diffstat (limited to 'django/db/backends/mysql/introspection.py')
-rw-r--r--django/db/backends/mysql/introspection.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py
index 65eae56493..a64e82e004 100644
--- a/django/db/backends/mysql/introspection.py
+++ b/django/db/backends/mysql/introspection.py
@@ -1,5 +1,6 @@
from collections import namedtuple
+import sqlparse
from MySQLdb.constants import FIELD_TYPE
from django.db.backends.base.introspection import (
@@ -189,6 +190,31 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
constraints[constraint]['unique'] = True
elif kind.lower() == "unique":
constraints[constraint]['unique'] = True
+ # Add check constraints.
+ if self.connection.features.can_introspect_check_constraints:
+ type_query = """
+ SELECT c.constraint_name, c.check_clause
+ FROM information_schema.check_constraints AS c
+ WHERE
+ c.constraint_schema = DATABASE() AND
+ c.table_name = %s
+ """
+ cursor.execute(type_query, [table_name])
+ for constraint, check_clause in cursor.fetchall():
+ # Parse columns.
+ columns = OrderedSet()
+ for statement in sqlparse.parse(check_clause):
+ for token in statement.flatten():
+ if token.ttype in [sqlparse.tokens.Name, sqlparse.tokens.Literal.String.Single]:
+ columns.add(token.value[1:-1])
+ constraints[constraint] = {
+ 'columns': columns,
+ 'primary_key': False,
+ 'unique': False,
+ 'index': False,
+ 'check': True,
+ 'foreign_key': None,
+ }
# Now add in the indexes
cursor.execute("SHOW INDEX FROM %s" % self.connection.ops.quote_name(table_name))
for table, non_unique, index, colseq, column, type_ in [x[:5] + (x[10],) for x in cursor.fetchall()]: