summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2020-06-02 17:56:31 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2020-06-02 17:56:31 +0000
commit58ea81121877330e4bacd5aa4934c2742fc11693 (patch)
tree654ddb206503cc494674a8092df3160a124bfc7b /lib/sqlalchemy
parentc7c564b57f3ce2fee30b44f22db7baf2f0fa9fe0 (diff)
parent9be0e9e5477cd6a494d9e3b3c13ceed1e50cc5a9 (diff)
downloadsqlalchemy-58ea81121877330e4bacd5aa4934c2742fc11693.tar.gz
Merge "Add default expression to query_expression()"
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/__init__.py17
-rw-r--r--lib/sqlalchemy/orm/strategies.py26
2 files changed, 33 insertions, 10 deletions
diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py
index 110c27811..fabb095a2 100644
--- a/lib/sqlalchemy/orm/__init__.py
+++ b/lib/sqlalchemy/orm/__init__.py
@@ -180,9 +180,22 @@ def deferred(*columns, **kw):
return ColumnProperty(deferred=True, *columns, **kw)
-def query_expression():
+def query_expression(default_expr=_sql.null()):
"""Indicate an attribute that populates from a query-time SQL expression.
+ :param default_expr: Optional SQL expression object that will be used in
+ all cases if not assigned later with :func:`_orm.with_expression`.
+ E.g.::
+
+ from sqlalchemy.sql import literal
+
+ class C(Base):
+ #...
+ my_expr = query_expression(literal(1))
+
+ .. versionadded:: 1.3.18
+
+
.. versionadded:: 1.2
.. seealso::
@@ -190,7 +203,7 @@ def query_expression():
:ref:`mapper_querytime_expression`
"""
- prop = ColumnProperty(_sql.null())
+ prop = ColumnProperty(default_expr)
prop.strategy_key = (("query_expression", True),)
return prop
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index 2b8c384c9..f67c23aab 100644
--- a/lib/sqlalchemy/orm/strategies.py
+++ b/lib/sqlalchemy/orm/strategies.py
@@ -245,6 +245,11 @@ class ExpressionColumnLoader(ColumnLoader):
def __init__(self, parent, strategy_key):
super(ExpressionColumnLoader, self).__init__(parent, strategy_key)
+ null = sql.null()
+ self._have_default_expression = any(
+ not c.compare(null) for c in self.parent_property.columns
+ )
+
def setup_query(
self,
compile_state,
@@ -256,19 +261,24 @@ class ExpressionColumnLoader(ColumnLoader):
memoized_populators,
**kwargs
):
-
+ columns = None
if loadopt and "expression" in loadopt.local_opts:
columns = [loadopt.local_opts["expression"]]
+ elif self._have_default_expression:
+ columns = self.parent_property.columns
- for c in columns:
- if adapter:
- c = adapter.columns[c]
- column_collection.append(c)
+ if columns is None:
+ return
- fetch = columns[0]
+ for c in columns:
if adapter:
- fetch = adapter.columns[fetch]
- memoized_populators[self.parent_property] = fetch
+ c = adapter.columns[c]
+ column_collection.append(c)
+
+ fetch = columns[0]
+ if adapter:
+ fetch = adapter.columns[fetch]
+ memoized_populators[self.parent_property] = fetch
def create_row_processor(
self, context, path, loadopt, mapper, result, adapter, populators