summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2017-06-26 15:47:50 -0400
committerGerrit Code Review <gerrit@awstats.zzzcomputing.com>2017-06-26 15:47:50 -0400
commit33d083c0347ccfb80fa546b0a580035ac7c48983 (patch)
tree10b6dcc3dc1e398a6e3399dd7df20e41e034bafa /lib
parentfae82dda00aaba597deae862088f15c9b5255716 (diff)
parent9ac0f8119e34a696fbf711e00262e9c0851b749c (diff)
downloadsqlalchemy-33d083c0347ccfb80fa546b0a580035ac7c48983.tar.gz
Merge "Support state expiration for with_expression(); rename deferred_expression"
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/orm/__init__.py6
-rw-r--r--lib/sqlalchemy/orm/attributes.py15
-rw-r--r--lib/sqlalchemy/orm/dynamic.py2
-rw-r--r--lib/sqlalchemy/orm/strategies.py11
-rw-r--r--lib/sqlalchemy/orm/strategy_options.py6
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}
)