From ac0785dc3e56ebe9fc8caa78cd9c564d5e796da3 Mon Sep 17 00:00:00 2001 From: Federico Caselli Date: Fri, 28 Apr 2023 21:24:43 +0200 Subject: Fix ExcludeConstraint with func. Fix autogenerate issue with PostgreSQL :class:`.ExcludeConstraint` that included sqlalchemy functions. The function text was previously rendered as a plain string without surrounding with ``text()``. Fixes: #1230 Change-Id: I0d59e04d5a64132ed86f92a27e4247ac9703f3e0 --- alembic/ddl/postgresql.py | 51 ++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) (limited to 'alembic') diff --git a/alembic/ddl/postgresql.py b/alembic/ddl/postgresql.py index 5fb981d..cc0488b 100644 --- a/alembic/ddl/postgresql.py +++ b/alembic/ddl/postgresql.py @@ -25,6 +25,7 @@ from sqlalchemy.sql import operators from sqlalchemy.sql.elements import ColumnClause from sqlalchemy.sql.elements import TextClause from sqlalchemy.sql.elements import UnaryExpression +from sqlalchemy.sql.functions import FunctionElement from sqlalchemy.types import NULLTYPE from .base import alter_column @@ -662,22 +663,15 @@ def _exclude_constraint( ("name", render._render_gen_name(autogen_context, constraint.name)) ) - if alter: + def do_expr_where_opts(): args = [ - repr(render._render_gen_name(autogen_context, constraint.name)) + "(%s, %r)" + % ( + _render_potential_column(sqltext, autogen_context), + opstring, + ) + for sqltext, name, opstring in constraint._render_exprs # type:ignore[attr-defined] # noqa ] - if not has_batch: - args += [repr(render._ident(constraint.table.name))] - args.extend( - [ - "(%s, %r)" - % ( - _render_potential_column(sqltext, autogen_context), - opstring, - ) - for sqltext, name, opstring in constraint._render_exprs # type:ignore[attr-defined] # noqa - ] - ) if constraint.where is not None: args.append( "where=%s" @@ -686,24 +680,21 @@ def _exclude_constraint( ) ) args.extend(["%s=%r" % (k, v) for k, v in opts]) + return args + + if alter: + args = [ + repr(render._render_gen_name(autogen_context, constraint.name)) + ] + if not has_batch: + args += [repr(render._ident(constraint.table.name))] + args.extend(do_expr_where_opts()) return "%(prefix)screate_exclude_constraint(%(args)s)" % { "prefix": render._alembic_autogenerate_prefix(autogen_context), "args": ", ".join(args), } else: - args = [ - "(%s, %r)" - % (_render_potential_column(sqltext, autogen_context), opstring) - for sqltext, name, opstring in constraint._render_exprs - ] - if constraint.where is not None: - args.append( - "where=%s" - % render._render_potential_expr( - constraint.where, autogen_context - ) - ) - args.extend(["%s=%r" % (k, v) for k, v in opts]) + args = do_expr_where_opts() return "%(prefix)sExcludeConstraint(%(args)s)" % { "prefix": _postgresql_autogenerate_prefix(autogen_context), "args": ", ".join(args), @@ -711,7 +702,7 @@ def _exclude_constraint( def _render_potential_column( - value: Union[ColumnClause, Column, TextClause], + value: Union[ColumnClause, Column, TextClause, FunctionElement], autogen_context: AutogenContext, ) -> str: if isinstance(value, ColumnClause): @@ -727,5 +718,7 @@ def _render_potential_column( } else: return render._render_potential_expr( - value, autogen_context, wrap_in_text=isinstance(value, TextClause) + value, + autogen_context, + wrap_in_text=isinstance(value, (TextClause, FunctionElement)), ) -- cgit v1.2.1