diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-04-05 20:59:42 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-04-06 12:12:26 -0400 |
| commit | 93b11905e599a6d73a85d2085e15385ebf46cdc6 (patch) | |
| tree | 5d6b770d7e5513cc180d264836fb23811f3755f0 /lib/sqlalchemy | |
| parent | 764126039cd25044f0eefd002bb6b49065eed3ce (diff) | |
| download | sqlalchemy-93b11905e599a6d73a85d2085e15385ebf46cdc6.tar.gz | |
Consider mysql partition options separately from other table options
Move down all the PARTITION, SUBPARTITION options
into a separate segment so that they come out at the
end of CREATE TABLE after the table options.
Change-Id: Iaa1c823848c93680ca22d72bda1b7c49742b9060
Fixes: #3961
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/base.py | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index da59ba6fa..c6c1eb8bb 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -1032,11 +1032,18 @@ class MySQLDDLCompiler(compiler.DDLCompiler): if table.comment is not None: opts['COMMENT'] = table.comment + partition_options = [ + 'PARTITION_BY', 'PARTITIONS', 'SUBPARTITIONS', + 'SUBPARTITION_BY' + ] + + nonpart_options = set(opts).difference(partition_options) + part_options = set(opts).intersection(partition_options) + for opt in topological.sort([ ('DEFAULT_CHARSET', 'COLLATE'), ('DEFAULT_CHARACTER_SET', 'COLLATE'), - ('PARTITION_BY', 'PARTITIONS'), # only for test consistency - ], opts): + ], nonpart_options): arg = opts[opt] if opt in _reflection._options_of_type_string: arg = "'%s'" % arg.replace("\\", "\\\\").replace("'", "''") @@ -1044,16 +1051,33 @@ class MySQLDDLCompiler(compiler.DDLCompiler): if opt in ('DATA_DIRECTORY', 'INDEX_DIRECTORY', 'DEFAULT_CHARACTER_SET', 'CHARACTER_SET', 'DEFAULT_CHARSET', - 'DEFAULT_COLLATE', 'PARTITION_BY'): + 'DEFAULT_COLLATE'): opt = opt.replace('_', ' ') joiner = '=' if opt in ('TABLESPACE', 'DEFAULT CHARACTER SET', - 'CHARACTER SET', 'COLLATE', - 'PARTITION BY', 'PARTITIONS'): + 'CHARACTER SET', 'COLLATE'): joiner = ' ' table_opts.append(joiner.join((opt, arg))) + + for opt in topological.sort([ + ('PARTITION_BY', 'PARTITIONS'), + ('PARTITION_BY', 'SUBPARTITION_BY'), + ('PARTITION_BY', 'SUBPARTITIONS'), + ('PARTITIONS', 'SUBPARTITIONS'), + ('PARTITIONS', 'SUBPARTITION_BY'), + ('SUBPARTITION_BY', 'SUBPARTITIONS') + ], part_options): + arg = opts[opt] + if opt in _reflection._options_of_type_string: + arg = "'%s'" % arg.replace("\\", "\\\\").replace("'", "''") + + opt = opt.replace('_', ' ') + joiner = ' ' + + table_opts.append(joiner.join((opt, arg))) + return ' '.join(table_opts) def visit_create_index(self, create): |
