From: Mike Bayer Date: Sun, 2 Nov 2014 17:46:20 +0000 (-0500) Subject: - Bound parameters are now resolved as "literal" values within the X-Git-Tag: rel_0_7_1~11^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0fa7716ffe6ac1261c9446162d6486f0411ed4df;p=thirdparty%2Fsqlalchemy%2Falembic.git - Bound parameters are now resolved as "literal" values within the SQL expression inside of a CheckConstraint(), when rendering the SQL as a text string; supported for SQLAlchemy 0.8.0 and forward. fixes #219 --- diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 67fb2ca7..0344b774 100644 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@ -31,14 +31,19 @@ class _f_name(object): return "%sf(%r)" % (self.prefix, self.name) -def _render_potential_expr(value, autogen_context): +def _render_potential_expr(value, autogen_context, wrap_in_text=True): if isinstance(value, sql.ClauseElement): if compat.sqla_08: compile_kw = dict(compile_kwargs={'literal_binds': True}) else: compile_kw = {} - return "%(prefix)stext(%(sql)r)" % { + if wrap_in_text: + template = "%(prefix)stext(%(sql)r)" + else: + template = "%(sql)r" + + return template % { "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), "sql": str( value.compile(dialect=autogen_context['dialect'], @@ -490,15 +495,12 @@ def _render_check_constraint(constraint, autogen_context): repr(_render_gen_name(autogen_context, constraint.name)) ) ) - return "%(prefix)sCheckConstraint(%(sqltext)r%(opts)s)" % { + return "%(prefix)sCheckConstraint(%(sqltext)s%(opts)s)" % { "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), "opts": ", " + (", ".join("%s=%s" % (k, v) for k, v in opts)) if opts else "", - "sqltext": str( - constraint.sqltext.compile( - dialect=autogen_context['dialect'] - ) - ) + "sqltext": _render_potential_expr( + constraint.sqltext, autogen_context, wrap_in_text=False) } _constraint_renderers = { diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index 042990b8..d8b85b82 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -5,6 +5,14 @@ Changelog .. changelog:: :version: 0.7.0 + .. change:: + :tags: bug, autogenerate + :tickets: 219 + + Bound parameters are now resolved as "literal" values within the + SQL expression inside of a CheckConstraint(), when rendering the SQL + as a text string; supported for SQLAlchemy 0.8.0 and forward. + .. change:: :tags: bug, autogenerate :tickets: 199 diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py index 889af2d5..648b3f7a 100644 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@ -699,6 +699,17 @@ render:primary_key\n)""" "sa.CheckConstraint('c > 5 AND c < 10')" ) + @config.requirements.fail_before_sqla_080 + def test_render_check_constraint_literal_binds(self): + c = column('c') + eq_ignore_whitespace( + autogenerate.render._render_check_constraint( + CheckConstraint(and_(c > 5, c < 10)), + self.autogen_context + ), + "sa.CheckConstraint('c > 5 AND c < 10')" + ) + def test_render_unique_constraint_opts(self): m = MetaData() t = Table('t', m, Column('c', Integer))