Skip to content

Commit

Permalink
SQLAlchemy 2: disable eager loading includes, rework needed
Browse files Browse the repository at this point in the history
  • Loading branch information
tadams42 committed Jul 21, 2023
1 parent 938941f commit 013e036
Showing 1 changed file with 43 additions and 35 deletions.
78 changes: 43 additions & 35 deletions src/flask_rest_jsonapi_next/data_layers/alchemy.py
Original file line number Diff line number Diff line change
Expand Up @@ -672,41 +672,49 @@ def eagerload_includes(self, query, qs):
:param QueryStringManager qs: a querystring manager to retrieve information from url
:return Query: the query with includes eagerloaded
"""
for include in qs.include:
joinload_object = None

if "." in include:
current_schema = self.resource.schema
for obj in include.split("."):
try:
field = get_model_field(current_schema, obj)
except Exception as e:
raise InvalidInclude(str(e))

if joinload_object is None:
joinload_object = joinedload(field)
else:
joinload_object = joinload_object.joinedload(field)

related_schema_cls = get_related_schema(current_schema, obj)

if isinstance(related_schema_cls, SchemaABC):
related_schema_cls = related_schema_cls.__class__
else:
related_schema_cls = class_registry.get_class(
related_schema_cls
)

current_schema = related_schema_cls
else:
try:
field = get_model_field(self.resource.schema, include)
except Exception as e:
raise InvalidInclude(str(e))

joinload_object = joinedload(field)

query = query.options(joinload_object)
# TODO:
# Broken on SQLAlchemy 2.x, needs rework
# https://docs.sqlalchemy.org/en/20/changelog/changelog_20.html#change-c4886b74af98b72892877aefa7d6a6a4
#
# > Loader options no longer accept strings for attribute names. The
# > long-documented approach of using Class.attrname for loader option targets is
# > now standard.

# for include in qs.include:
# joinload_object = None

# if "." in include:
# current_schema = self.resource.schema
# for obj in include.split("."):
# try:
# field = get_model_field(current_schema, obj)
# except Exception as e:
# raise InvalidInclude(str(e))

# if joinload_object is None:
# joinload_object = joinedload(field)
# else:
# joinload_object = joinload_object.joinedload(field)

# related_schema_cls = get_related_schema(current_schema, obj)

# if isinstance(related_schema_cls, SchemaABC):
# related_schema_cls = related_schema_cls.__class__
# else:
# related_schema_cls = class_registry.get_class(
# related_schema_cls
# )

# current_schema = related_schema_cls
# else:
# try:
# field = get_model_field(self.resource.schema, include)
# except Exception as e:
# raise InvalidInclude(str(e))

# joinload_object = joinedload(field)

# query = query.options(joinload_object)

return query

Expand Down

0 comments on commit 013e036

Please sign in to comment.