diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2020-06-02 17:56:31 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2020-06-02 17:56:31 +0000 |
| commit | 58ea81121877330e4bacd5aa4934c2742fc11693 (patch) | |
| tree | 654ddb206503cc494674a8092df3160a124bfc7b /lib/sqlalchemy | |
| parent | c7c564b57f3ce2fee30b44f22db7baf2f0fa9fe0 (diff) | |
| parent | 9be0e9e5477cd6a494d9e3b3c13ceed1e50cc5a9 (diff) | |
| download | sqlalchemy-58ea81121877330e4bacd5aa4934c2742fc11693.tar.gz | |
Merge "Add default expression to query_expression()"
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/__init__.py | 17 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 26 |
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 |
