if raiseerr:
raise sa_exc.ArgumentError(
'Can\'t find property named "%s" on '
- "%s in this Query. " % (attr, ent)
+ "%s in this Query." % (attr, ent)
)
else:
return None
path = path[attr]
elif _is_mapped_class(attr):
+ # TODO: this does not appear to be a valid codepath. "attr"
+ # would never be a mapper. This block is present in 1.2
+ # as well howver does not seem to be accessed in any tests.
if not orm_util._entity_corresponds_to_use_path_impl(
attr.parent, path[-1]
):
if raiseerr:
raise sa_exc.ArgumentError(
'Attribute "%s" does not '
- 'link from element "%s"' % (attr, path.entity)
+ 'link from element "%s".%s'
+ % (
+ attr,
+ path.entity,
+ (
+ " Did you mean to use "
+ "%s.of_type(%s)?"
+ % (path[-2], attr.class_.__name__)
+ if len(path) > 1
+ and path.entity.is_mapper
+ and attr.parent.is_aliased_class
+ else ""
+ ),
+ )
)
else:
return None
assert_raises_message(
sa.exc.ArgumentError,
r'Attribute "Manager.manager_name" does not link from element '
- r'"with_polymorphic\(Person, \[Engineer\]\)"',
+ r'"with_polymorphic\(Person, \[Engineer\]\)".$',
s.query(Company).options,
joinedload(Company.employees.of_type(Engineer)).load_only(
Manager.manager_name
assert_raises_message(
sa.exc.ArgumentError,
r'Attribute "Manager.status" does not link from element '
- r'"with_polymorphic\(Person, \[Engineer\]\)"',
+ r'"with_polymorphic\(Person, \[Engineer\]\)".$',
s.query(Company).options,
joinedload(Company.employees.of_type(Engineer)).load_only(
Manager.status
assert_raises_message(
sa.exc.ArgumentError,
r'Can\'t find property named "manager_name" on '
- "mapped class Engineer->engineers in this Query.",
+ r"mapped class Engineer->engineers in this Query.$",
s.query(Company).options,
joinedload(Company.employees.of_type(Engineer)).load_only(
"manager_name"
assert_raises_message(
sa.exc.ArgumentError,
r'Attribute "Manager.manager_name" does not link from '
- r'element "with_polymorphic\(Person, \[Manager\]\)"',
+ r'element "with_polymorphic\(Person, \[Manager\]\)".$',
s.query(Company).options,
joinedload(Company.employees.of_type(wp)).load_only(
Manager.manager_name
),
)
+ def test_missing_attr_is_missing_of_type_for_alias(self):
+ s = Session()
+
+ pa = aliased(Person)
+
+ assert_raises_message(
+ sa.exc.ArgumentError,
+ r'Attribute "AliasedClass_Person.name" does not link from '
+ r'element "mapped class Person->people". Did you mean to use '
+ r"Company.employees.of_type\(AliasedClass_Person\)\?",
+ s.query(Company).options,
+ joinedload(Company.employees).load_only(pa.name),
+ )
+
+ q = s.query(Company).options(
+ joinedload(Company.employees.of_type(pa)).load_only(pa.name)
+ )
+ orig_path = inspect(Company)._path_registry[
+ Company.employees.property
+ ][inspect(pa)][pa.name.property]
+ key = ("loader", orig_path.natural_path)
+ loader = q._attributes[key]
+ eq_(loader.path, orig_path)
+
class PickleTest(PathTest, QueryTest):
def _option_fixture(self, *arg):