-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
import re
log = logging.getLogger(__name__)
+def _render_potential_expr(value, autogen_context):
+ if isinstance(value, sql.ClauseElement):
+ if compat.sqla_08:
+ return str(
+ value.compile(dialect=autogen_context['dialect'],
+ compile_kwargs={'literal_binds': True}))
+ else:
+ return str(value.compile(dialect=autogen_context['dialect']))
+ else:
+ return str(value)
+
def _add_table(table, autogen_context):
text = "%(prefix)screate_table(%(tablename)r,\n%(args)s" % {
'tablename': table.name,
'unique': index.unique or False,
'schema': (", schema='%s'" % index.table.schema) if index.table.schema else '',
'kwargs': (', '+', '.join(
- ["%s='%s'" % (key, val) for key, val in index.kwargs.items()]))\
+ ["%s=%r" % (key, _render_potential_expr(val, autogen_context))
+ for key, val in index.kwargs.items()]))\
if len(index.kwargs) else ''
}
return text
UniqueConstraint, Boolean, ForeignKeyConstraint,\
PrimaryKeyConstraint, Index, func
from sqlalchemy.types import NULLTYPE, TIMESTAMP
-from sqlalchemy.dialects import mysql
+from sqlalchemy.dialects import mysql, postgresql
from sqlalchemy.engine.reflection import Inspector
from sqlalchemy.sql import and_, column, literal_column
-from alembic import autogenerate, util
+from alembic import autogenerate, util, compat
from alembic.migration import MigrationContext
from . import staging_env, sqlite_db, clear_staging_env, eq_, \
eq_ignore_whitespace, requires_07, db_for_dialect
},
'dialect': mysql.dialect()
}
+ cls.pg_autogen_context = {
+ 'opts': {
+ 'sqlalchemy_module_prefix': 'sa.',
+ 'alembic_module_prefix': 'op.',
+ },
+ 'dialect': postgresql.dialect()
+ }
+
def test_render_add_index(self):
"""
"['active', 'code'], unique=False, schema='CamelSchema')"
)
+ def test_render_add_index_pg_where(self):
+ autogen_context = self.pg_autogen_context
+
+ m = MetaData()
+ t = Table('t', m,
+ Column('x', String),
+ Column('y', String)
+ )
+
+ idx = Index('foo_idx', t.c.x, t.c.y,
+ postgresql_where=(t.c.y == 'something'))
+
+ if compat.sqla_08:
+ eq_ignore_whitespace(
+ autogenerate.render._add_index(idx, autogen_context),
+ """op.create_index('foo_idx', 't', ['x', 'y'], unique=False, """
+ """postgresql_where="t.y = 'something'")"""
+ )
+ else:
+ eq_ignore_whitespace(
+ autogenerate.render._add_index(idx, autogen_context),
+ """op.create_index('foo_idx', 't', ['x', 'y'], unique=False, """
+ """postgresql_where='t.y = %(y_1)s')"""
+ )
+
# def test_render_add_index_func(self):
# """
# autogenerate.render._drop_index using func -- TODO: SQLA needs to