From: Carlos Eduardo Rivera Date: Wed, 27 Aug 2014 19:06:22 +0000 (-0500) Subject: Rendering expressions for indexes X-Git-Tag: rel_0_7_0~78^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d105d96bb236bf224a63b9bc8195c5faedc78e3e;p=thirdparty%2Fsqlalchemy%2Falembic.git Rendering expressions for indexes --- diff --git a/alembic/autogenerate/compare.py b/alembic/autogenerate/compare.py index a50bc6dd..477c10df 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 1b49804b..0e30d5b5 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 9cd2d823..981649cf 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): """