summaryrefslogtreecommitdiff
path: root/alembic
diff options
context:
space:
mode:
authorFederico Caselli <cfederico87@gmail.com>2023-04-28 21:24:43 +0200
committerFederico Caselli <cfederico87@gmail.com>2023-04-28 21:24:43 +0200
commitac0785dc3e56ebe9fc8caa78cd9c564d5e796da3 (patch)
tree2b5b0f58069a9ac28dba9f622e086f267c8df959 /alembic
parentabd175bf86b1091fe444b91c4f98dc9ea97ff723 (diff)
downloadalembic-ac0785dc3e56ebe9fc8caa78cd9c564d5e796da3.tar.gz
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
Diffstat (limited to 'alembic')
-rw-r--r--alembic/ddl/postgresql.py51
1 files changed, 22 insertions, 29 deletions
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)),
)