summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Eduardo Rivera <cerivera@fastmail.fm>2014-08-27 14:06:22 -0500
committerCarlos Eduardo Rivera <cerivera@fastmail.fm>2014-08-27 14:06:22 -0500
commitd105d96bb236bf224a63b9bc8195c5faedc78e3e (patch)
tree1addc1db7e183a107fa985da74e3e927aa4465c6
parent19930ce67a79a5253f22ce15d605e3ca476a7968 (diff)
downloadalembic-d105d96bb236bf224a63b9bc8195c5faedc78e3e.tar.gz
Rendering expressions for indexes
-rw-r--r--alembic/autogenerate/compare.py13
-rw-r--r--alembic/autogenerate/render.py4
-rw-r--r--tests/test_autogen_render.py42
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):
"""