diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-05-20 13:41:44 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-05-21 14:16:03 -0400 |
commit | 4550983e0ce2f35b3585e53894c941c23693e71d (patch) | |
tree | 3928e6e333c2b9bb6e23a4de079565a387d309ae /lib/sqlalchemy/orm/loading.py | |
parent | 3d55263c92ee29a0257d823124c353a35246cf31 (diff) | |
download | sqlalchemy-4550983e0ce2f35b3585e53894c941c23693e71d.tar.gz |
Performance fixes for new result set
A few small mistakes led to huge callcounts. Additionally,
the warn-on-get behavior which is attempting to warn for
deprecated access in SQLAlchemy 2.0 is very expensive; it's not clear
if its feasible to have this warning or to somehow alter how it
works.
Fixes: #5340
Change-Id: I73bdd2d7b6f1b25cc0222accabd585cf761a5af4
Diffstat (limited to 'lib/sqlalchemy/orm/loading.py')
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py index 10d937945..0394d999c 100644 --- a/lib/sqlalchemy/orm/loading.py +++ b/lib/sqlalchemy/orm/loading.py @@ -78,7 +78,7 @@ def instances(query, cursor, context): ], ) - def chunks(size): + def chunks(size, as_tuples): while True: yield_per = size @@ -91,7 +91,13 @@ def instances(query, cursor, context): else: fetch = cursor.fetchall() - rows = [tuple([proc(row) for proc in process]) for row in fetch] + if not as_tuples: + proc = process[0] + rows = [proc(row) for row in fetch] + else: + rows = [ + tuple([proc(row) for proc in process]) for row in fetch + ] for path, post_load in context.post_load_paths.items(): post_load.invoke(context, path) @@ -101,14 +107,15 @@ def instances(query, cursor, context): if not yield_per: break - result = ChunkedIteratorResult(row_metadata, chunks) + result = ChunkedIteratorResult( + row_metadata, chunks, source_supports_scalars=single_entity + ) if query._yield_per: result.yield_per(query._yield_per) if single_entity: result = result.scalars() - # filtered = context.loaders_require_uniquing filtered = query._has_mapper_entities if filtered: @@ -796,6 +803,7 @@ def _populate_full( for key, set_callable in populators["expire"]: if set_callable: state.expired_attributes.add(key) + for key, populator in populators["new"]: populator(state, dict_, row) for key, populator in populators["delayed"]: |