diff options
author | Jan Katins <jasc@gmx.net> | 2023-03-06 16:18:17 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2023-03-06 19:25:59 -0500 |
commit | 6f8d9af59aa431aca3be851066c729c52b12a7a2 (patch) | |
tree | 444b0d5bf76c9788cc42b084661bc3df04ff52da /alembic | |
parent | cd7b1a94cc90ca533a84b47332900888151e22d0 (diff) | |
download | alembic-6f8d9af59aa431aca3be851066c729c52b12a7a2.tar.gz |
improve autogen rendering for PG ExcludeConstraint
Fixed issue regarding PostgreSQL :class:`.ExcludeConstraint`, where
constraint elements which made use of :func:`.literal_column` could not be
rendered for autogenerate. Additionally, using SQLAlchemy 2.0.5 or greater,
:func:`.text()` constructs are also supported within PostgreSQL
:class:`.ExcludeConstraint` objects for autogenerate render. Pull request
courtesy Jan Katins.
Fixes: #1184
Closes: #1185
Pull-request: https://github.com/sqlalchemy/alembic/pull/1185
Pull-request-sha: 68360ce9aa746a85407c5e1e04b8021123d98504
Change-Id: I302f3f4007a186ffac13b344ff6769dd302f28f5
Diffstat (limited to 'alembic')
-rw-r--r-- | alembic/ddl/postgresql.py | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/alembic/ddl/postgresql.py b/alembic/ddl/postgresql.py index 994d7cb..4ffc2eb 100644 --- a/alembic/ddl/postgresql.py +++ b/alembic/ddl/postgresql.py @@ -22,6 +22,7 @@ from sqlalchemy.dialects.postgresql import ExcludeConstraint from sqlalchemy.dialects.postgresql import INTEGER from sqlalchemy.schema import CreateIndex from sqlalchemy.sql.elements import ColumnClause +from sqlalchemy.sql.elements import TextClause from sqlalchemy.types import NULLTYPE from .base import alter_column @@ -650,7 +651,7 @@ def _exclude_constraint( args = [ "(%s, %r)" % (_render_potential_column(sqltext, autogen_context), opstring) - for sqltext, name, opstring in constraint._render_exprs # type:ignore[attr-defined] # noqa + for sqltext, name, opstring in constraint._render_exprs ] if constraint.where is not None: args.append( @@ -667,17 +668,21 @@ def _exclude_constraint( def _render_potential_column( - value: Union[ColumnClause, Column], autogen_context: AutogenContext + value: Union[ColumnClause, Column, TextClause], + autogen_context: AutogenContext, ) -> str: if isinstance(value, ColumnClause): - template = "%(prefix)scolumn(%(name)r)" + if value.is_literal: + # like literal_column("int8range(from, to)") in ExcludeConstraint + template = "%(prefix)sliteral_column(%(name)r)" + else: + template = "%(prefix)scolumn(%(name)r)" return template % { "prefix": render._sqlalchemy_autogenerate_prefix(autogen_context), "name": value.name, } - else: return render._render_potential_expr( - value, autogen_context, wrap_in_text=False + value, autogen_context, wrap_in_text=isinstance(value, TextClause) ) |