summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/postgresql/base.py
diff options
context:
space:
mode:
authorAlonM <alon.menczer@gmail.com>2020-11-15 08:13:25 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2020-11-16 14:02:49 -0500
commit018aa9870110ef97316e9984c7ecd7f3357b501a (patch)
tree2269fd252e87c83c4ad31925a7840124564871e1 /lib/sqlalchemy/dialects/postgresql/base.py
parentbddb1070f9fa846233255fd0acd5316404560de1 (diff)
downloadsqlalchemy-018aa9870110ef97316e9984c7ecd7f3357b501a.tar.gz
Add opsclass to exclusion constraint
Added new parameter :paramref:`_postgresql.ExcludeConstraint.ops` to the :class:`_postgresql.ExcludeConstraint` object, to support operator class specification with this constraint. Pull request courtesy Alon Menczer. Fixes: #5604 Closes: #5700 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5700 Pull-request-sha: f8613e100792fc0bb3cf300ec6aebc78ecdf0361 Change-Id: Iaf664131ec84f8c2fb05edf799198b8d3bb83597
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/base.py')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/base.py27
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py
index d738393e7..66fe2526e 100644
--- a/lib/sqlalchemy/dialects/postgresql/base.py
+++ b/lib/sqlalchemy/dialects/postgresql/base.py
@@ -781,6 +781,8 @@ using the ``postgresql_where`` keyword argument::
Index('my_index', my_table.c.id, postgresql_where=my_table.c.value > 10)
+.. _postgresql_operator_classes:
+
Operator Classes
^^^^^^^^^^^^^^^^
@@ -797,11 +799,10 @@ The :class:`.Index` construct allows these to be specified via the
'id': 'int4_ops'
})
-Note that the keys in the ``postgresql_ops`` dictionary are the "key" name of
-the :class:`_schema.Column`, i.e. the name used to access it from the ``.c``
-collection of :class:`_schema.Table`,
-which can be configured to be different than
-the actual name of the column as expressed in the database.
+Note that the keys in the ``postgresql_ops`` dictionaries are the
+"key" name of the :class:`_schema.Column`, i.e. the name used to access it from
+the ``.c`` collection of :class:`_schema.Table`, which can be configured to be
+different than the actual name of the column as expressed in the database.
If ``postgresql_ops`` is to be used against a complex SQL expression such
as a function call, then to apply to the column it must be given a label
@@ -815,6 +816,14 @@ that is identified in the dictionary by name, e.g.::
'id': 'int4_ops'
})
+Operator classes are also supported by the
+:class:`_postgresql.ExcludeConstraint` construct using the
+:paramref:`_postgresql.ExcludeConstraint.ops` parameter. See that parameter for
+details.
+
+.. versionadded:: 1.3.20 added support for operator classes with
+ :class:`_postgresql.ExcludeConstraint`.
+
Index Types
^^^^^^^^^^^
@@ -2417,9 +2426,13 @@ class PGDDLCompiler(compiler.DDLCompiler):
elements = []
for expr, name, op in constraint._render_exprs:
kw["include_table"] = False
- elements.append(
- "%s WITH %s" % (self.sql_compiler.process(expr, **kw), op)
+ exclude_element = self.sql_compiler.process(expr, **kw) + (
+ (" " + constraint.ops[expr.key])
+ if hasattr(expr, "key") and expr.key in constraint.ops
+ else ""
)
+
+ elements.append("%s WITH %s" % (exclude_element, op))
text += "EXCLUDE USING %s (%s)" % (
self.preparer.validate_sql_phrase(
constraint.using, IDX_USING