--- /dev/null
+.. change::
+ :tags: bug, orm
+ :tickets: 4433
+
+ Improved error messages emitted by the ORM in the area of loader option
+ traversal. This includes early detection of mis-matched loader strategies
+ along with a clearer explanation why these strategies don't match.
+
"""A single database result was required but more than one were found."""
+class LoaderStrategyException(sa_exc.InvalidRequestError):
+ """A loader strategy for an attribute does not exist."""
+
+ def __init__(
+ self,
+ applied_to_property_type,
+ requesting_property,
+ applies_to,
+ actual_strategy_type,
+ strategy_key,
+ ):
+ if actual_strategy_type is None:
+ sa_exc.InvalidRequestError.__init__(
+ self,
+ "Can't find strategy %s for %s"
+ % (strategy_key, requesting_property),
+ )
+ else:
+ sa_exc.InvalidRequestError.__init__(
+ self,
+ 'Can\'t apply "%s" strategy to property "%s", '
+ 'which is a "%s"; this loader strategy is intended '
+ 'to be used with a "%s".'
+ % (
+ util.clsname_as_plain_name(actual_strategy_type),
+ requesting_property,
+ util.clsname_as_plain_name(applied_to_property_type),
+ util.clsname_as_plain_name(applies_to),
+ ),
+ )
+
+
def _safe_cls_name(cls):
try:
cls_name = ".".join((cls.__module__, cls.__name__))
import collections
+from . import exc as orm_exc
from . import path_registry
from .base import _MappedAttribute # noqa
from .base import EXT_CONTINUE
try:
return self._strategies[key]
except KeyError:
- cls = self._strategy_lookup(*key)
+ cls = self._strategy_lookup(self, *key)
self._strategies[key] = self._strategies[cls] = strategy = cls(
self, key
)
return decorate
@classmethod
- def _strategy_lookup(cls, *key):
+ def _strategy_lookup(cls, requesting_property, *key):
for prop_cls in cls.__mro__:
if prop_cls in cls._all_strategies:
strategies = cls._all_strategies[prop_cls]
return strategies[key]
except KeyError:
pass
- raise Exception("can't locate strategy for %s %s" % (cls, key))
+
+ for property_type, strats in cls._all_strategies.items():
+ if key in strats:
+ intended_property_type = property_type
+ actual_strategy = strats[key]
+ break
+ else:
+ intended_property_type = None
+ actual_strategy = None
+
+ raise orm_exc.LoaderStrategyException(
+ cls,
+ requesting_property,
+ intended_property_type,
+ actual_strategy,
+ key,
+ )
class MapperOption(object):
return "<Mapper at 0x%x; %s>" % (id(self), self.class_.__name__)
def __str__(self):
- return "Mapper|%s|%s%s" % (
+ return "mapped class %s%s->%s" % (
self.class_.__name__,
- self.local_table is not None
- and self.local_table.description
- or None,
- self.non_primary and "|non-primary" or "",
+ self.non_primary and " (non-primary)" or "",
+ self.local_table.description
+ if self.local_table is not None
+ else self.persist_selectable.description,
)
def _is_orphan(self, state):
else:
query._attributes.update(self.context)
- def _generate_path(self, path, attr, wildcard_key, raiseerr=True):
+ def _generate_path(
+ self, path, attr, for_strategy, wildcard_key, raiseerr=True
+ ):
existing_of_type = self._of_type
self._of_type = None
-
if raiseerr and not path.has_entity:
if isinstance(path, TokenRegistry):
raise sa_exc.ArgumentError(
)
else:
raise sa_exc.ArgumentError(
- "Attribute '%s' of entity '%s' does not "
- "refer to a mapped entity"
- % (path.prop.key, path.parent.entity)
+ "Mapped attribute '%s' does not "
+ "refer to a mapped entity" % (path.prop,)
)
if isinstance(attr, util.string_types):
except AttributeError:
if raiseerr:
raise sa_exc.ArgumentError(
- "Can't find property named '%s' on the "
- "mapped entity %s in this Query. " % (attr, ent)
+ 'Can\'t find property named "%s" on '
+ "%s in this Query. " % (attr, ent)
)
else:
return None
else:
- attr = attr.property
+ attr = found_property = attr.property
path = path[attr]
elif _is_mapped_class(attr):
else:
return None
else:
- prop = attr.property
+ prop = found_property = attr.property
if not prop.parent.common_parent(path.mapper):
if raiseerr:
else:
path = path[prop]
+ if for_strategy is not None:
+ found_property._get_strategy(for_strategy)
if path.has_entity:
path = path.entity_path
self.path = path
self.is_class_strategy = False
self.propagate_to_loaders = propagate_to_loaders
# if the path is a wildcard, this will set propagate_to_loaders=False
- self._generate_path(self.path, attr, "relationship")
+ self._generate_path(self.path, attr, strategy, "relationship")
self.strategy = strategy
if strategy is not None:
self._set_path_strategy()
for attr in attrs:
cloned = self._generate()
cloned.strategy = strategy
- cloned._generate_path(self.path, attr, "column")
+ cloned._generate_path(self.path, attr, strategy, "column")
cloned.propagate_to_loaders = True
if opts:
cloned.local_opts.update(opts)
strategy = self._coerce_strat(strategy)
for attr in attrs:
- path = self._generate_path(self.path, attr, None)
+ path = self._generate_path(self.path, attr, strategy, None)
cloned = self._generate()
cloned.strategy = strategy
cloned.path = path
strategy = self._coerce_strat(strategy)
cloned = self._generate()
cloned.is_class_strategy = True
- path = cloned._generate_path(self.path, None, None)
+ path = cloned._generate_path(self.path, None, strategy, None)
cloned.strategy = strategy
cloned.path = path
cloned.propagate_to_loaders = True
def _set_path_strategy(self):
self._to_bind.append(self)
- def _generate_path(self, path, attr, wildcard_key):
+ def _generate_path(self, path, attr, for_strategy, wildcard_key):
if (
wildcard_key
and isinstance(attr, util.string_types)
elif isinstance(token, PropComparator):
prop = token.property
entity = self._find_entity_prop_comparator(
- entities, prop.key, token._parententity, raiseerr
+ entities, prop, token._parententity, raiseerr
)
elif self.is_class_strategy and _is_mapped_class(token):
entity = inspect(token)
path = loader.path
if not loader.is_class_strategy:
- for token in start_path:
+ for idx, token in enumerate(start_path):
+
if not loader._generate_path(
- loader.path, token, None, raiseerr
+ loader.path,
+ token,
+ self.strategy if idx == len(start_path) - 1 else None,
+ None,
+ raiseerr,
):
return
return loader
- def _find_entity_prop_comparator(self, entities, token, mapper, raiseerr):
+ def _find_entity_prop_comparator(self, entities, prop, mapper, raiseerr):
if _is_aliased_class(mapper):
searchfor = mapper
else:
if raiseerr:
if not list(entities):
raise sa_exc.ArgumentError(
- "Query has only expression-based entities - "
- "can't find property named '%s'." % (token,)
+ "Query has only expression-based entities, "
+ 'which do not apply to %s "%s"'
+ % (util.clsname_as_plain_name(type(prop)), prop)
)
else:
raise sa_exc.ArgumentError(
- "Can't find property '%s' on any entity "
- "specified in this Query. Note the full path "
- "from root (%s) to target entity must be specified."
- % (token, ",".join(str(x) for x in entities))
+ 'Mapped attribute "%s" does not apply to any of the '
+ "root entities in this query, e.g. %s. Please "
+ "specify the full path "
+ "from one of the root entities to the target "
+ "attribute. "
+ % (prop, ", ".join(str(x) for x in entities))
)
else:
return None
if len(list(entities)) != 1:
if raiseerr:
raise sa_exc.ArgumentError(
- "Wildcard loader can only be used with exactly "
- "one entity. Use Load(ent) to specify "
- "specific entities."
+ "Can't apply wildcard ('*') or load_only() "
+ "loader option to multiple entities %s. Specify "
+ "loader options for each entity individually, such "
+ "as %s."
+ % (
+ ", ".join(str(ent) for ent in entities),
+ ", ".join(
+ "Load(%s).some_option('*')" % ent
+ for ent in entities
+ ),
+ )
)
elif token.endswith(_DEFAULT_TOKEN):
raiseerr = False
if raiseerr:
raise sa_exc.ArgumentError(
"Query has only expression-based entities - "
- "can't find property named '%s'." % (token,)
+ 'can\'t find property named "%s".' % (token,)
)
else:
return None
self._aliased_insp._target.__name__,
)
+ def __str__(self):
+ return str(self._aliased_insp)
+
class AliasedInsp(InspectionAttr):
"""Provide an inspection interface for an
with_poly,
)
+ def __str__(self):
+ return "aliased(%s)" % (self._target.__name__,)
+
inspection._inspects(AliasedClass)(lambda target: target._aliased_insp)
inspection._inspects(AliasedInsp)(lambda target: target)
from .langhelpers import chop_traceback # noqa
from .langhelpers import class_hierarchy # noqa
from .langhelpers import classproperty # noqa
+from .langhelpers import clsname_as_plain_name # noqa
from .langhelpers import coerce_kw_type # noqa
from .langhelpers import constructor_copy # noqa
from .langhelpers import counter # noqa
compat.reraise(type_, value, traceback)
+def clsname_as_plain_name(cls):
+ return " ".join(
+ n.lower() for n in re.findall(r"([A-Z][a-z]+)", cls.__name__)
+ )
+
+
def decode_slice(slc):
"""decode a slice object as sent to __getitem__.
sa.exc.InvalidRequestError,
"^One or more mappers failed to initialize"
" - can't proceed with initialization of other mappers. "
- r"Triggering mapper: 'Mapper\|User\|users'. "
+ r"Triggering mapper: 'mapped class User->users'. "
"Original exception was: When initializing.*",
configure_mappers,
)
)
assert_raises_message(
sa_exc.SAWarning,
- r"On mapper Mapper\|Employee\|employees, "
+ r"On mapper mapped class Employee->employees, "
"primary key column 'persons.id' is being "
"combined with distinct primary key column 'employees.eid' "
"in attribute 'id'. Use explicit properties to give "
self._assert_eager_with_entity_exception(
[Item],
(joinedload_all("keywords.foo"),),
- r"Can't find property named 'foo' on the mapped entity "
- r"Mapper\|Keyword\|keywords in this Query.",
+ 'Can\'t find property named \\"foo\\" on mapped class '
+ "Keyword->keywords in this Query.",
)
def test_all_path_vs_chained(self):
for i in range(3):
assert_raises_message(
sa.exc.InvalidRequestError,
- "^One or more "
- "mappers failed to initialize - can't "
- "proceed with initialization of other "
- r"mappers. Triggering mapper\: "
- r"'Mapper\|Address\|addresses'."
- " Original exception was: Class "
- "'test.orm._fixtures.User' is not mapped$",
+ "One or more mappers failed to initialize - can't "
+ "proceed with initialization of other mappers. "
+ "Triggering mapper: 'mapped class Address->addresses'. "
+ "Original exception was: Class 'test.orm._fixtures.User' "
+ "is not mapped",
configure_mappers,
)
assert_raises_message(
sa.exc.ArgumentError,
- "Can't find property 'items' on any entity "
- "specified in this Query.",
+ 'Mapped attribute "Order.items" does not apply to any of the '
+ "root entities in this query, e.g. mapped class User->users. "
+ "Please specify the full path from one of the root entities "
+ "to the target attribute.",
sess.query(User).options,
sa.orm.joinedload(Order.items),
)
from sqlalchemy.orm import column_property
from sqlalchemy.orm import create_session
from sqlalchemy.orm import defaultload
+from sqlalchemy.orm import exc as orm_exc
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import lazyload
from sqlalchemy.orm import Load
+from sqlalchemy.orm import load_only
from sqlalchemy.orm import mapper
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
result = Load(User)
eq_(
result._generate_path(
- inspect(User)._path_registry, User.addresses, "relationship"
+ inspect(User)._path_registry,
+ User.addresses,
+ None,
+ "relationship",
),
self._make_path_registry([User, "addresses", Address]),
)
result = Load(User)
eq_(
result._generate_path(
- inspect(User)._path_registry, User.name, "column"
+ inspect(User)._path_registry, User.name, None, "column"
),
self._make_path_registry([User, "name"]),
)
result = Load(User)
eq_(
result._generate_path(
- inspect(User)._path_registry, "addresses", "relationship"
+ inspect(User)._path_registry, "addresses", None, "relationship"
),
self._make_path_registry([User, "addresses", Address]),
)
result = Load(User)
eq_(
result._generate_path(
- inspect(User)._path_registry, "name", "column"
+ inspect(User)._path_registry, "name", None, "column"
),
self._make_path_registry([User, "name"]),
)
result._generate_path,
result.path,
User.addresses,
+ None,
"relationship",
)
result._generate_path,
inspect(User)._path_registry,
Order.items,
+ None,
"relationship",
)
result._generate_path(
inspect(User)._path_registry,
Order.items,
+ None,
"relationship",
False,
),
Item = self.classes.Item
message = (
- "Query has only expression-based entities - "
- "can't find property named 'keywords'."
+ "Query has only expression-based entities - can't "
+ 'find property named "keywords".'
)
self._assert_eager_with_just_column_exception(
Item.id, "keywords", message
self._assert_eager_with_just_column_exception(
Item.id,
Item.keywords,
- "Query has only expression-based entities "
- "- can't find property named 'keywords'.",
+ "Query has only expression-based entities, which do not apply "
+ 'to relationship property "Item.keywords"',
)
def test_option_against_nonexistent_PropComparator(self):
self._assert_eager_with_entity_exception(
[Keyword],
(joinedload(Item.keywords),),
- r"Can't find property 'keywords' on any entity specified "
- r"in this Query. Note the full path from root "
- r"\(Mapper\|Keyword\|keywords\) to target entity must be "
- r"specified.",
+ 'Mapped attribute "Item.keywords" does not apply to any of the '
+ "root entities in this query, e.g. mapped class "
+ "Keyword->keywords. Please specify the full path from one of "
+ "the root entities to the target attribute. ",
)
def test_option_against_nonexistent_basestring(self):
self._assert_eager_with_entity_exception(
[Item],
(joinedload("foo"),),
- r"Can't find property named 'foo' on the mapped "
- r"entity Mapper\|Item\|items in this Query.",
+ 'Can\'t find property named "foo" on mapped class '
+ "Item->items in this Query.",
)
def test_option_against_nonexistent_twolevel_basestring(self):
self._assert_eager_with_entity_exception(
[Item],
(joinedload("keywords.foo"),),
- r"Can't find property named 'foo' on the mapped entity "
- r"Mapper\|Keyword\|keywords in this Query.",
+ 'Can\'t find property named "foo" on mapped class '
+ "Keyword->keywords in this Query.",
)
def test_option_against_nonexistent_twolevel_chained(self):
self._assert_eager_with_entity_exception(
[Item],
(joinedload("keywords").joinedload("foo"),),
- r"Can't find property named 'foo' on the mapped entity "
- r"Mapper\|Keyword\|keywords in this Query.",
+ 'Can\'t find property named "foo" on mapped class '
+ "Keyword->keywords in this Query.",
)
@testing.fails_if(
def test_option_against_wrong_entity_type_basestring(self):
Item = self.classes.Item
- self._assert_eager_with_entity_exception(
+ self._assert_loader_strategy_exception(
[Item],
(joinedload("id").joinedload("keywords"),),
- r"Attribute 'id' of entity 'Mapper\|Item\|items' does not "
- r"refer to a mapped entity",
+ 'Can\'t apply "joined loader" strategy to property "Item.id", '
+ 'which is a "column property"; this loader strategy is '
+ 'intended to be used with a "relationship property".',
+ )
+
+ def test_col_option_against_relationship_basestring(self):
+ Item = self.classes.Item
+ self._assert_loader_strategy_exception(
+ [Item],
+ (load_only("keywords"),),
+ 'Can\'t apply "column loader" strategy to property '
+ '"Item.keywords", which is a "relationship property"; this '
+ 'loader strategy is intended to be used with a "column property".',
+ )
+
+ def test_load_only_against_multi_entity_attr(self):
+ User = self.classes.User
+ Item = self.classes.Item
+ self._assert_eager_with_entity_exception(
+ [User, Item],
+ (load_only(User.id, Item.id),),
+ r"Can't apply wildcard \('\*'\) or load_only\(\) loader option "
+ "to multiple entities mapped class User->users, mapped class "
+ "Item->items. Specify loader options for each entity "
+ "individually, such as "
+ r"Load\(mapped class User->users\).some_option\('\*'\), "
+ r"Load\(mapped class Item->items\).some_option\('\*'\).",
+ )
+
+ def test_col_option_against_relationship_attr(self):
+ Item = self.classes.Item
+ self._assert_loader_strategy_exception(
+ [Item],
+ (load_only(Item.keywords),),
+ 'Can\'t apply "column loader" strategy to property '
+ '"Item.keywords", which is a "relationship property"; this '
+ 'loader strategy is intended to be used with a "column property".',
)
def test_option_against_multi_non_relation_twolevel_basestring(self):
Item = self.classes.Item
Keyword = self.classes.Keyword
- self._assert_eager_with_entity_exception(
+ self._assert_loader_strategy_exception(
[Keyword, Item],
(joinedload("id").joinedload("keywords"),),
- r"Attribute 'id' of entity 'Mapper\|Keyword\|keywords' "
- "does not refer to a mapped entity",
+ 'Can\'t apply "joined loader" strategy to property "Keyword.id", '
+ 'which is a "column property"; this loader strategy is intended '
+ 'to be used with a "relationship property".',
)
def test_option_against_multi_nonexistent_basestring(self):
self._assert_eager_with_entity_exception(
[Keyword, Item],
(joinedload("description"),),
- r"Can't find property named 'description' on the mapped "
- r"entity Mapper\|Keyword\|keywords in this Query.",
+ 'Can\'t find property named "description" on mapped class '
+ "Keyword->keywords in this Query.",
)
def test_option_against_multi_no_entities_basestring(self):
[Keyword.id, Item.id],
(joinedload("keywords"),),
r"Query has only expression-based entities - can't find property "
- "named 'keywords'.",
+ 'named "keywords".',
)
def test_option_against_wrong_multi_entity_type_attr_one(self):
Item = self.classes.Item
Keyword = self.classes.Keyword
- self._assert_eager_with_entity_exception(
+ self._assert_loader_strategy_exception(
[Keyword, Item],
(joinedload(Keyword.id).joinedload(Item.keywords),),
- r"Attribute 'id' of entity 'Mapper\|Keyword\|keywords' "
- "does not refer to a mapped entity",
+ 'Can\'t apply "joined loader" strategy to property "Keyword.id", '
+ 'which is a "column property"; this loader strategy is intended '
+ 'to be used with a "relationship property".',
)
def test_option_against_wrong_multi_entity_type_attr_two(self):
Item = self.classes.Item
Keyword = self.classes.Keyword
- self._assert_eager_with_entity_exception(
+ self._assert_loader_strategy_exception(
[Keyword, Item],
(joinedload(Keyword.keywords).joinedload(Item.keywords),),
- r"Attribute 'keywords' of entity 'Mapper\|Keyword\|keywords' "
- "does not refer to a mapped entity",
+ 'Can\'t apply "joined loader" strategy to property '
+ '"Keyword.keywords", which is a "column property"; this loader '
+ 'strategy is intended to be used with a "relationship property".',
)
def test_option_against_wrong_multi_entity_type_attr_three(self):
self._assert_eager_with_entity_exception(
[Keyword.id, Item.id],
(joinedload(Keyword.keywords).joinedload(Item.keywords),),
- r"Query has only expression-based entities - "
- "can't find property named 'keywords'.",
+ "Query has only expression-based entities, which do not apply to "
+ 'column property "Keyword.keywords"',
)
def test_wrong_type_in_option(self):
key = ("loader", (inspect(Item), inspect(Item).attrs.keywords))
assert key in q._attributes
+ def _assert_loader_strategy_exception(self, entity_list, options, message):
+ assert_raises_message(
+ orm_exc.LoaderStrategyException,
+ message,
+ create_session().query(*entity_list).options,
+ *options
+ )
+
def _assert_eager_with_entity_exception(
self, entity_list, options, message
):
r"User.addresses references "
r"relationship Address.dingaling, "
r"which does not "
- r"reference mapper Mapper\|User\|users",
+ r"reference mapper mapped class User->users",
configure_mappers,
)
assert_raises_message(
orm_exc.UnmappedColumnError,
"Can't execute sync rule for source column 't2.id'; "
- r"mapper 'Mapper\|A\|t1' does not map this column.",
+ r"mapper 'mapped class A->t1' does not map this column.",
sync.populate,
a1,
a_mapper,
orm_exc.UnmappedColumnError,
r"Can't execute sync rule for destination "
r"column 't1.id'; "
- r"mapper 'Mapper\|B\|t2' does not map this column.",
+ r"mapper 'mapped class B->t2' does not map this column.",
sync.populate,
a1,
a_mapper,
assert_raises_message(
orm_exc.UnmappedColumnError,
"Can't execute sync rule for destination "
- r"column 't1.foo'; mapper 'Mapper\|B\|t2' does not "
+ r"column 't1.foo'; mapper 'mapped class B->t2' does not "
"map this column.",
sync.clear,
b1,
assert_raises_message(
orm_exc.UnmappedColumnError,
"Can't execute sync rule for source column 't2.id'; "
- r"mapper 'Mapper\|A\|t1' does not map this column.",
+ r"mapper 'mapped class A->t1' does not map this column.",
sync.update,
a1,
a_mapper,
assert_raises_message(
orm_exc.UnmappedColumnError,
"Can't execute sync rule for source column 't2.id'; "
- r"mapper 'Mapper\|A\|t1' does not map this column.",
+ r"mapper 'mapped class A->t1' does not map this column.",
sync.populate_dict,
a1,
a_mapper,
assert_raises_message(
orm_exc.UnmappedColumnError,
"Can't execute sync rule for source column 't2.id'; "
- r"mapper 'Mapper\|A\|t1' does not map this column.",
+ r"mapper 'mapped class A->t1' does not map this column.",
sync.source_modified,
uowcommit,
a1,
# TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_mssql_pyodbc_dbapiunicode_cextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_mysql_mysqldb_dbapiunicode_cextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_mysql_mysqldb_dbapiunicode_nocextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_oracle_cx_oracle_dbapiunicode_cextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 104
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_mssql_pyodbc_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_mssql_pyodbc_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_mysql_mysqldb_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_mysql_mysqldb_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_oracle_cx_oracle_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_oracle_cx_oracle_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_postgresql_psycopg2_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_postgresql_psycopg2_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_sqlite_pysqlite_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.6_sqlite_pysqlite_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_mysql_mysqldb_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_mysql_mysqldb_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 81
test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 81
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_bound_branching 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 81
# TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_mssql_pyodbc_dbapiunicode_cextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_mysql_mysqldb_dbapiunicode_cextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_mysql_mysqldb_dbapiunicode_nocextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_oracle_cx_oracle_dbapiunicode_cextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 651
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_mssql_pyodbc_dbapiunicode_cextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_mssql_pyodbc_dbapiunicode_nocextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_mysql_mysqldb_dbapiunicode_cextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_mysql_mysqldb_dbapiunicode_nocextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_oracle_cx_oracle_dbapiunicode_cextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_oracle_cx_oracle_dbapiunicode_nocextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_postgresql_psycopg2_dbapiunicode_cextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_postgresql_psycopg2_dbapiunicode_nocextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_sqlite_pysqlite_dbapiunicode_cextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.6_sqlite_pysqlite_dbapiunicode_nocextensions 624
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_mysql_mysqldb_dbapiunicode_cextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_mysql_mysqldb_dbapiunicode_nocextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 628
-test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 628
+test.aaa_profiling.test_orm.BranchedOptionTest.test_generate_cache_key_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 668
# TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_mssql_pyodbc_dbapiunicode_cextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_mysql_mysqldb_dbapiunicode_cextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_mysql_mysqldb_dbapiunicode_nocextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_oracle_cx_oracle_dbapiunicode_cextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 45
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_mssql_pyodbc_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_mssql_pyodbc_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_mysql_mysqldb_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_mysql_mysqldb_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_oracle_cx_oracle_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_oracle_cx_oracle_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_postgresql_psycopg2_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_postgresql_psycopg2_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_sqlite_pysqlite_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.6_sqlite_pysqlite_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_mysql_mysqldb_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_mysql_mysqldb_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 46
test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 46
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_key_bound_branching 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 46
# TEST: test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_mssql_pyodbc_dbapiunicode_cextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_mssql_pyodbc_dbapiunicode_nocextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_mysql_mysqldb_dbapiunicode_cextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_mysql_mysqldb_dbapiunicode_nocextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_oracle_cx_oracle_dbapiunicode_cextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_cextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_cextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 460
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_mssql_pyodbc_dbapiunicode_cextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_mssql_pyodbc_dbapiunicode_nocextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_mysql_mysqldb_dbapiunicode_cextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_mysql_mysqldb_dbapiunicode_nocextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_oracle_cx_oracle_dbapiunicode_cextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_oracle_cx_oracle_dbapiunicode_nocextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_postgresql_psycopg2_dbapiunicode_cextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_postgresql_psycopg2_dbapiunicode_nocextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_sqlite_pysqlite_dbapiunicode_cextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.6_sqlite_pysqlite_dbapiunicode_nocextensions 466
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_mysql_mysqldb_dbapiunicode_cextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_mysql_mysqldb_dbapiunicode_nocextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_cextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_cextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 470
-test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 470
+test.aaa_profiling.test_orm.BranchedOptionTest.test_query_opts_unbound_branching 3.7_sqlite_pysqlite_dbapiunicode_cextensions 504
# TEST: test.aaa_profiling.test_orm.DeferOptionsTest.test_baseline