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'],
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 = {
.. 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
"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))