Skip to content

Commit 170b601

Browse files
jekeljekel
authored andcommitted
Added SubqueryLoader to load model from query alias
1 parent fd0d2df commit 170b601

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

gino/loader.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@ def none_as_none(self, enabled=True):
159159
return self
160160

161161

162+
class SubqueryLoader(ModelLoader):
163+
def __init__(self, model, subquery, **extras):
164+
super().__init__(model, **extras)
165+
self.columns = [subquery.corresponding_column(column) for column
166+
in model]
167+
168+
162169
class AliasLoader(ModelLoader):
163170
def __init__(self, alias, *columns, **extras):
164171
super().__init__(alias, *columns, **extras)

tests/test_loader.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,27 @@ async def test_loader_with_aggregation(user):
204204
assert user_count is None
205205

206206

207+
async def test_adjanency_list_on_nested_load(user):
208+
subquery = db.select(User).alias()
209+
base_query = subquery.outerjoin(Team).select()
210+
211+
query = base_query.execution_options(loader=(User.load('id')))
212+
u = await query.gino.first()
213+
# Because here arrives team_id, not user_id, and replaces it
214+
assert u.id is None
215+
216+
from gino.loader import SubqueryLoader
217+
query = base_query.execution_options(loader=SubqueryLoader(User, subquery, team=Team))
218+
u = await query.gino.first()
219+
assert u.id == user.id
220+
assert u.realname == user.realname
221+
assert u.nickname == user.nickname
222+
223+
assert isinstance(u.team, Team)
224+
assert u.team.id == user.team.id
225+
assert u.team.name == user.team.name
226+
227+
207228
async def test_adjacency_list_query_builder(user):
208229
group = Team.alias()
209230
u = await User.load(team=Team.load(parent=group.on(

0 commit comments

Comments
 (0)