]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Rendering expressions for indexes
authorCarlos Eduardo Rivera <cerivera@fastmail.fm>
Wed, 27 Aug 2014 19:06:22 +0000 (14:06 -0500)
committerCarlos Eduardo Rivera <cerivera@fastmail.fm>
Wed, 27 Aug 2014 19:06:22 +0000 (14:06 -0500)
alembic/autogenerate/compare.py
alembic/autogenerate/render.py
tests/test_autogen_render.py

index a50bc6ddd5c86ede5cfffa255f992d292abbcc9c..477c10df06322547e650aca9dc03426a91cf4b30 100644 (file)
@@ -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):
index 1b49804bffcfabf5285dff3c713a187d7160859f..0e30d5b5ec49039a4ed12e7ad2cc780d0f7bf968 100644 (file)
@@ -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(
index 9cd2d823b7a51ab2d35f2fee822c2de810c7faa0..981649cf7617ac3ff0ffd5c14586d4e6ffdb253e 100644 (file)
@@ -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):
         """