diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-08-19 18:39:08 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-09-28 19:22:17 -0400 |
| commit | 29b752f8b24909c9c715e1b2c5e01119d1f46aa7 (patch) | |
| tree | 185996396104825d3698a37782ead35ddeae4522 /lib/sqlalchemy/dialects/mysql/reflection.py | |
| parent | 68b52c48b775f9a99d0bc3666ebe02c54e401303 (diff) | |
| download | sqlalchemy-29b752f8b24909c9c715e1b2c5e01119d1f46aa7.tar.gz | |
Support mariadb 10.2
Fixed issue where CURRENT_TIMESTAMP would not reflect correctly
in the MariaDB 10.2 series due to a syntax change, where the function
is now represented as ``current_timestamp()``.
Fixes: #4096
MariaDB 10.2 now supports CHECK constraints (warning: use version 10.2.9
or greater due to upstream issues noted in :ticket:`4097`). Reflection
now takes these CHECK constraints into account when they are present in
the ``SHOW CREATE TABLE`` output.
Fixes: #4098
Change-Id: I8666d61814e8145ca12cbecad94019b44af868e3
Diffstat (limited to 'lib/sqlalchemy/dialects/mysql/reflection.py')
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/reflection.py | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/reflection.py b/lib/sqlalchemy/dialects/mysql/reflection.py index bb907045c..cc607aba6 100644 --- a/lib/sqlalchemy/dialects/mysql/reflection.py +++ b/lib/sqlalchemy/dialects/mysql/reflection.py @@ -20,7 +20,8 @@ class ReflectedState(object): self.table_options = {} self.table_name = None self.keys = [] - self.constraints = [] + self.fk_constraints = [] + self.ck_constraints = [] @log.class_logger @@ -56,8 +57,10 @@ class MySQLTableDefinitionParser(object): util.warn("Unknown schema content: %r" % line) elif type_ == 'key': state.keys.append(spec) - elif type_ == 'constraint': - state.constraints.append(spec) + elif type_ == 'fk_constraint': + state.fk_constraints.append(spec) + elif type_ == 'ck_constraint': + state.ck_constraints.append(spec) else: pass return state @@ -76,8 +79,8 @@ class MySQLTableDefinitionParser(object): spec['columns'] = self._parse_keyexprs(spec['columns']) return 'key', spec - # CONSTRAINT - m = self._re_constraint.match(line) + # FOREIGN KEY CONSTRAINT + m = self._re_fk_constraint.match(line) if m: spec = m.groupdict() spec['table'] = \ @@ -86,7 +89,13 @@ class MySQLTableDefinitionParser(object): for c in self._parse_keyexprs(spec['local'])] spec['foreign'] = [c[0] for c in self._parse_keyexprs(spec['foreign'])] - return 'constraint', spec + return 'fk_constraint', spec + + # CHECK constraint + m = self._re_ck_constraint.match(line) + if m: + spec = m.groupdict() + return 'ck_constraint', spec # PARTITION and SUBPARTITION m = self._re_partition.match(line) @@ -331,8 +340,8 @@ class MySQLTableDefinitionParser(object): r"(?: +COLLATE +(?P<collate>[\w_]+))?" r"(?: +(?P<notnull>(?:NOT )?NULL))?" r"(?: +DEFAULT +(?P<default>" - r"(?:NULL|'(?:''|[^'])*'|\w+" - r"(?: +ON UPDATE \w+)?)" + r"(?:NULL|'(?:''|[^'])*'|[\w\(\)]+" + r"(?: +ON UPDATE [\w\(\)]+)?)" r"))?" r"(?: +(?P<autoincr>AUTO_INCREMENT))?" r"(?: +COMMENT +'(?P<comment>(?:''|[^'])*)')?" @@ -378,7 +387,7 @@ class MySQLTableDefinitionParser(object): # unique constraints come back as KEYs kw = quotes.copy() kw['on'] = 'RESTRICT|CASCADE|SET NULL|NOACTION' - self._re_constraint = _re_compile( + self._re_fk_constraint = _re_compile( r' ' r'CONSTRAINT +' r'%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +' @@ -393,6 +402,19 @@ class MySQLTableDefinitionParser(object): % kw ) + # CONSTRAINT `CONSTRAINT_1` CHECK (`x` > 5)' + # testing on MariaDB 10.2 shows that the CHECK constraint + # is returned on a line by itself, so to match without worrying + # about parenthesis in the expresion we go to the end of the line + self._re_ck_constraint = _re_compile( + r' ' + r'CONSTRAINT +' + r'%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +' + r'CHECK +' + r'\((?P<sqltext>.+)\),?' + % kw + ) + # PARTITION # # punt! |
