diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2017-06-26 15:47:50 -0400 |
---|---|---|
committer | Gerrit Code Review <gerrit@awstats.zzzcomputing.com> | 2017-06-26 15:47:50 -0400 |
commit | 33d083c0347ccfb80fa546b0a580035ac7c48983 (patch) | |
tree | 10b6dcc3dc1e398a6e3399dd7df20e41e034bafa /lib | |
parent | fae82dda00aaba597deae862088f15c9b5255716 (diff) | |
parent | 9ac0f8119e34a696fbf711e00262e9c0851b749c (diff) | |
download | sqlalchemy-33d083c0347ccfb80fa546b0a580035ac7c48983.tar.gz |
Merge "Support state expiration for with_expression(); rename deferred_expression"
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sqlalchemy/orm/__init__.py | 6 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/attributes.py | 15 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/dynamic.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 11 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/strategy_options.py | 6 |
5 files changed, 27 insertions, 13 deletions
diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py index 80c27e392..846d2c2a7 100644 --- a/lib/sqlalchemy/orm/__init__.py +++ b/lib/sqlalchemy/orm/__init__.py @@ -178,18 +178,18 @@ def deferred(*columns, **kw): return ColumnProperty(deferred=True, *columns, **kw) -def deferred_expression(): +def query_expression(): """Indicate an attribute that populates from a query-time SQL expression. .. versionadded:: 1.2 .. seealso:: - :ref:`mapper_deferred_expression` + :ref:`mapper_query_expression` """ prop = ColumnProperty(_sql.null()) - prop.strategy_key = (("deferred_expression", True),) + prop.strategy_key = (("query_expression", True),) return prop mapper = public_factory(Mapper, ".orm.mapper") diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index f3a5c4735..01cb0056e 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -388,7 +388,7 @@ class AttributeImpl(object): callable_, dispatch, trackparent=False, extension=None, compare_function=None, active_history=False, parent_token=None, expire_missing=True, - send_modified_events=True, + send_modified_events=True, accepts_scalar_loader=None, **kwargs): r"""Construct an AttributeImpl. @@ -449,6 +449,11 @@ class AttributeImpl(object): else: self.is_equal = compare_function + if accepts_scalar_loader is not None: + self.accepts_scalar_loader = accepts_scalar_loader + else: + self.accepts_scalar_loader = self.default_accepts_scalar_loader + # TODO: pass in the manager here # instead of doing a lookup attr = manager_of_class(class_)[key] @@ -465,7 +470,7 @@ class AttributeImpl(object): __slots__ = ( 'class_', 'key', 'callable_', 'dispatch', 'trackparent', 'parent_token', 'send_modified_events', 'is_equal', 'expire_missing', - '_modified_token' + '_modified_token', 'accepts_scalar_loader' ) def _init_modified_token(self): @@ -657,7 +662,7 @@ class AttributeImpl(object): class ScalarAttributeImpl(AttributeImpl): """represents a scalar value-holding InstrumentedAttribute.""" - accepts_scalar_loader = True + default_accepts_scalar_loader = True uses_objects = False supports_population = True collection = False @@ -743,7 +748,7 @@ class ScalarObjectAttributeImpl(ScalarAttributeImpl): """ - accepts_scalar_loader = False + default_accepts_scalar_loader = False uses_objects = True supports_population = True collection = False @@ -867,7 +872,7 @@ class CollectionAttributeImpl(AttributeImpl): semantics to the orm layer independent of the user data implementation. """ - accepts_scalar_loader = False + default_accepts_scalar_loader = False uses_objects = True supports_population = True collection = True diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py index 9f99740d9..bb63067b0 100644 --- a/lib/sqlalchemy/orm/dynamic.py +++ b/lib/sqlalchemy/orm/dynamic.py @@ -44,7 +44,7 @@ class DynaLoader(strategies.AbstractRelationshipLoader): class DynamicAttributeImpl(attributes.AttributeImpl): uses_objects = True - accepts_scalar_loader = False + default_accepts_scalar_loader = False supports_population = False collection = False diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index 4e7636cf8..4b9eb3b0f 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -195,7 +195,7 @@ class ColumnLoader(LoaderStrategy): @log.class_logger -@properties.ColumnProperty.strategy_for(deferred_expression=True) +@properties.ColumnProperty.strategy_for(query_expression=True) class ExpressionColumnLoader(ColumnLoader): def __init__(self, parent, strategy_key): super(ExpressionColumnLoader, self).__init__(parent, strategy_key) @@ -235,6 +235,15 @@ class ExpressionColumnLoader(ColumnLoader): else: populators["expire"].append((self.key, True)) + def init_class_attribute(self, mapper): + self.is_class_level = True + + _register_attribute( + self.parent_property, mapper, useobject=False, + compare_function=self.columns[0].type.compare_values, + accepts_scalar_loader=False + ) + @log.class_logger @properties.ColumnProperty.strategy_for(deferred=True, instrument=True) diff --git a/lib/sqlalchemy/orm/strategy_options.py b/lib/sqlalchemy/orm/strategy_options.py index 2cdf6ba95..796f859f8 100644 --- a/lib/sqlalchemy/orm/strategy_options.py +++ b/lib/sqlalchemy/orm/strategy_options.py @@ -1356,7 +1356,7 @@ from .util import _orm_full_deannotate def with_expression(loadopt, key, expression): r"""Apply an ad-hoc SQL expression to a "deferred expression" attribute. - This option is used in conjunction with the :func:`.orm.deferred_expression` + This option is used in conjunction with the :func:`.orm.query_expression` mapper-level construct that indicates an attribute which should be the target of an ad-hoc SQL expression. @@ -1375,7 +1375,7 @@ def with_expression(loadopt, key, expression): .. seealso:: - :ref:`mapper_deferred_expression` + :ref:`mapper_query_expression` """ @@ -1384,7 +1384,7 @@ def with_expression(loadopt, key, expression): return loadopt.set_column_strategy( (key, ), - {"deferred_expression": True}, + {"query_expression": True}, opts={"expression": expression} ) |