diff options
author | Hasan Ramezani <hasan.r67@gmail.com> | 2019-07-14 01:24:35 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-07-19 11:05:06 +0200 |
commit | 1fc2c70f7613e014a31771afa537439b28dd35fb (patch) | |
tree | dae8ebfe89e687edb518bd6031d89f9c47f774c9 /django/db/backends/mysql/introspection.py | |
parent | 7f612eda80db1c1c8e502aced54c2062080eae46 (diff) | |
download | django-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.py | 26 |
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()]: |