]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- Bound parameters are now resolved as "literal" values within the
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 2 Nov 2014 17:46:20 +0000 (12:46 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 2 Nov 2014 17:46:20 +0000 (12:46 -0500)
SQL expression inside of a CheckConstraint(), when rendering the SQL
as a text string; supported for SQLAlchemy 0.8.0 and forward.
fixes #219

alembic/autogenerate/render.py
docs/build/changelog.rst
tests/test_autogen_render.py

index 67fb2ca76487a6affbc5e228d7e25b1b62d6cbb4..0344b7741763623b62e71b0be10f49ff10100f2e 100644 (file)
@@ -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 = {
index 042990b8aa3de0854345e3e91ea012c51c320d20..d8b85b82514bcc1365d80dcf2714ad47ad546ce6 100644 (file)
@@ -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
index 889af2d537915b746f5d7bc50a1d3abbc8fcad76..648b3f7afcf9219e81f90b396d0f93c9b17904c8 100644 (file)
@@ -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))