diff options
author | Carlos Eduardo Rivera <cerivera@fastmail.fm> | 2014-08-27 14:06:22 -0500 |
---|---|---|
committer | Carlos Eduardo Rivera <cerivera@fastmail.fm> | 2014-08-27 14:06:22 -0500 |
commit | d105d96bb236bf224a63b9bc8195c5faedc78e3e (patch) | |
tree | 1addc1db7e183a107fa985da74e3e927aa4465c6 | |
parent | 19930ce67a79a5253f22ce15d605e3ca476a7968 (diff) | |
download | alembic-d105d96bb236bf224a63b9bc8195c5faedc78e3e.tar.gz |
Rendering expressions for indexes
-rw-r--r-- | alembic/autogenerate/compare.py | 13 | ||||
-rw-r--r-- | alembic/autogenerate/render.py | 4 | ||||
-rw-r--r-- | tests/test_autogen_render.py | 42 |
3 files changed, 36 insertions, 23 deletions
diff --git a/alembic/autogenerate/compare.py b/alembic/autogenerate/compare.py index a50bc6d..477c10d 100644 --- a/alembic/autogenerate/compare.py +++ b/alembic/autogenerate/compare.py @@ -1,8 +1,8 @@ from sqlalchemy.exc import NoSuchTableError -from sqlalchemy import schema as sa_schema, types as sqltypes +from sqlalchemy import schema as sa_schema, types as sqltypes, sql import logging from .. import compat -from .render import _render_server_default +from .render import _render_server_default, _render_potential_expr from sqlalchemy.util import OrderedSet @@ -196,11 +196,14 @@ class _ix_constraint_sig(_constraint_sig): def column_names(self): return _get_index_column_names(self.const) -def _get_index_column_names(idx): +def _get_index_column_names(idx, autogen_context=None): if compat.sqla_08: - return [getattr(exp, "name", None) for exp in idx.expressions] + return [repr(getattr(exp, "name", None)) + if isinstance(exp, sql.schema.Column) + else _render_potential_expr(exp, autogen_context) + for exp in idx.expressions] else: - return [getattr(col, "name", None) for col in idx.columns] + return [repr(getattr(col, "name", None)) for col in idx.columns] def _compare_indexes_and_uniques(schema, tname, object_filters, conn_table, metadata_table, diffs, autogen_context, inspector): diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 1b49804..0e30d5b 100644 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@ -89,12 +89,12 @@ def _add_index(index, autogen_context): """ from .compare import _get_index_column_names - text = "%(prefix)screate_index(%(name)r, '%(table)s', %(columns)s, "\ + text = "%(prefix)screate_index(%(name)r, '%(table)s', [%(columns)s], "\ "unique=%(unique)r%(schema)s%(kwargs)s)" % { 'prefix': _alembic_autogenerate_prefix(autogen_context), 'name': _render_gen_name(autogen_context, index.name), 'table': index.table.name, - 'columns': _get_index_column_names(index), + 'columns': ", ".join(_get_index_column_names(index, autogen_context)), 'unique': index.unique or False, 'schema': (", schema='%s'" % index.table.schema) if index.table.schema else '', 'kwargs': (', '+', '.join( diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py index 9cd2d82..981649c 100644 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@ -99,22 +99,32 @@ class AutogenRenderTest(TestCase): """postgresql_where=sa.text('t.y = %(y_1)s'))""" ) - # def test_render_add_index_func(self): - # """ - # autogenerate.render._drop_index using func -- TODO: SQLA needs to - # reflect expressions as well as columns - # """ - # m = MetaData() - # t = Table('test', m, - # Column('id', Integer, primary_key=True), - # Column('active', Boolean()), - # Column('code', String(255)), - # ) - # idx = Index('test_active_lower_code_idx', t.c.active, func.lower(t.c.code)) - # eq_ignore_whitespace( - # autogenerate.render._add_index(idx, self.autogen_context), - # "" - # ) + def test_render_add_index_func(self): + m = MetaData() + t = Table('test', m, + Column('id', Integer, primary_key=True), + Column('code', String(255)) + ) + idx = Index('test_lower_code_idx', func.lower(t.c.code)) + eq_ignore_whitespace( + autogenerate.render._add_index(idx, self.autogen_context), + "op.create_index('test_lower_code_idx', 'test', " + "[sa.text('lower(test.code)')], unique=False)" + ) + + def test_render_add_index_desc(self): + m = MetaData() + t = Table('test', m, + Column('id', Integer, primary_key=True), + Column('code', String(255)) + ) + idx = Index('test_desc_code_idx', t.c.code.desc()) + eq_ignore_whitespace( + autogenerate.render._add_index(idx, self.autogen_context), + "op.create_index('test_desc_code_idx', 'test', " + "[sa.text('test.code DESC')], unique=False)" + ) + def test_drop_index(self): """ |