summaryrefslogtreecommitdiff
path: root/alembic
diff options
context:
space:
mode:
authorJan Katins <jasc@gmx.net>2023-03-06 16:18:17 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2023-03-06 19:25:59 -0500
commit6f8d9af59aa431aca3be851066c729c52b12a7a2 (patch)
tree444b0d5bf76c9788cc42b084661bc3df04ff52da /alembic
parentcd7b1a94cc90ca533a84b47332900888151e22d0 (diff)
downloadalembic-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.py15
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)
)