Skip to content

Commit 526efd3

Browse files
committed
fix #717, return empty objects instead of None
For queries that request for selected columns and all the returned results are NULL, still construct the objects with all values None.
1 parent 70e4bc1 commit 526efd3

File tree

3 files changed

+29
-36
lines changed

3 files changed

+29
-36
lines changed

mysql_tests/test_loader.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -368,23 +368,12 @@ async def test_tuple_loader_279(user):
368368

369369

370370
async def test_none_as_none_281(user):
371-
import gino
371+
query = Team.outerjoin(User).select()
372+
loader = Team, User
373+
assert any(row[1] is None for row in await query.gino.load(loader).all())
372374

373-
if gino.__version__ < "0.9":
374-
query = Team.outerjoin(User).select()
375-
loader = Team, User.none_as_none()
376-
assert any(row[1] is None for row in await query.gino.load(loader).all())
377-
378-
loader = Team.distinct(Team.id).load(add_member=User.none_as_none())
379-
assert any(not team.members for team in await query.gino.load(loader).all())
380-
381-
if gino.__version__ >= "0.8.0":
382-
query = Team.outerjoin(User).select()
383-
loader = Team, User
384-
assert any(row[1] is None for row in await query.gino.load(loader).all())
385-
386-
loader = Team.distinct(Team.id).load(add_member=User)
387-
assert any(not team.members for team in await query.gino.load(loader).all())
375+
loader = Team.distinct(Team.id).load(add_member=User)
376+
assert any(not team.members for team in await query.gino.load(loader).all())
388377

389378

390379
async def test_model_in_query(user):
@@ -400,3 +389,10 @@ async def test_model_in_query(user):
400389
assert users[0] != user
401390
assert users[0].id == user.id
402391
assert users[0].nickname == user.nickname
392+
393+
394+
async def test_empty_model(user):
395+
u = await User.query.with_only_columns([User.realname]).gino.first()
396+
assert u is not None
397+
assert u.id is None
398+
assert u.realname is None

src/gino/loader.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ def __init__(self, model, *columns, **extras):
212212
self.extras = dict((key, self.get(value)) for key, value in extras.items())
213213
self.on_clause = None
214214

215-
def _do_load(self, row):
215+
def _do_load(self, row, none_as_none):
216216
values = dict((c.name, row[c]) for c in self.columns if c in row)
217-
if all((v is None) for v in values.values()):
217+
if none_as_none and all((v is None) for v in values.values()):
218218
return None
219219
rv = self.model()
220220
for c in self.columns:
@@ -241,17 +241,18 @@ def do_load(self, row, context):
241241
key = tuple(row[col] for col in self._distinct)
242242
rv = ctx.get(key, _none)
243243
if rv is _none:
244-
rv = self._do_load(row)
244+
rv = self._do_load(row, context.get('none_as_none', False))
245245
ctx[key] = rv
246246
else:
247247
distinct = False
248248
else:
249-
rv = self._do_load(row)
249+
rv = self._do_load(row, context.get('none_as_none', False))
250250

251251
if rv is None:
252252
return None, None
253253
else:
254254
for key, value in self.extras.items():
255+
context.setdefault('none_as_none', True)
255256
value, distinct_ = value.do_load(row, context)
256257
if distinct_ is None:
257258
continue

tests/test_loader.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -368,23 +368,12 @@ async def test_tuple_loader_279(user):
368368

369369

370370
async def test_none_as_none_281(user):
371-
import gino
371+
query = Team.outerjoin(User).select()
372+
loader = Team, User
373+
assert any(row[1] is None for row in await query.gino.load(loader).all())
372374

373-
if gino.__version__ < "0.9":
374-
query = Team.outerjoin(User).select()
375-
loader = Team, User.none_as_none()
376-
assert any(row[1] is None for row in await query.gino.load(loader).all())
377-
378-
loader = Team.distinct(Team.id).load(add_member=User.none_as_none())
379-
assert any(not team.members for team in await query.gino.load(loader).all())
380-
381-
if gino.__version__ >= "0.8.0":
382-
query = Team.outerjoin(User).select()
383-
loader = Team, User
384-
assert any(row[1] is None for row in await query.gino.load(loader).all())
385-
386-
loader = Team.distinct(Team.id).load(add_member=User)
387-
assert any(not team.members for team in await query.gino.load(loader).all())
375+
loader = Team.distinct(Team.id).load(add_member=User)
376+
assert any(not team.members for team in await query.gino.load(loader).all())
388377

389378

390379
async def test_model_in_query(user):
@@ -400,3 +389,10 @@ async def test_model_in_query(user):
400389
assert users[0] != user
401390
assert users[0].id == user.id
402391
assert users[0].nickname == user.nickname
392+
393+
394+
async def test_empty_model(user):
395+
u = await User.query.with_only_columns([User.realname]).gino.first()
396+
assert u is not None
397+
assert u.id is None
398+
assert u.realname is None

0 commit comments

Comments
 (0)