From 441364126c40752fa0cddf8dcb02f73ce716c6de Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Fri, 1 Mar 2013 16:52:47 +0200 Subject: [PATCH] Added defer_except() --- CHANGES.rst | 10 ++++++++-- setup.py | 2 +- sqlalchemy_utils/__init__.py | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 13dbef0..ac2dc79 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,13 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. -0.1.0 (12.1.2013) -^^^^^^^^^^^^^^^^^ +0.2.0 (2013-03-01) +^^^^^^^^^^^^^^^^^^ + +- Added new function defer_except() + + +0.1.0 (2013-01-12) +^^^^^^^^^^^^^^^^^^ - Initial public release diff --git a/setup.py b/setup.py index 1ed632d..28ad7c7 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ class PyTest(Command): setup( name='SQLAlchemy-Utils', - version='0.1', + version='0.2', url='https://github.com/kvesteri/sqlalchemy-utils', license='BSD', author='Konsta Vesterinen', diff --git a/sqlalchemy_utils/__init__.py b/sqlalchemy_utils/__init__.py index f6f2060..60b65ab 100644 --- a/sqlalchemy_utils/__init__.py +++ b/sqlalchemy_utils/__init__.py @@ -1,5 +1,7 @@ +from sqlalchemy.orm import defer from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.query import _ColumnEntity +from sqlalchemy.orm.properties import ColumnProperty from sqlalchemy.sql.expression import desc, asc @@ -113,6 +115,27 @@ def sort_query(query, sort): return query +def defer_except(query, columns): + """ + Deferred loads all columns in given query, except the ones given. + + >>> from sqlalchemy_utils import defer_except + >>> query = session.query(User) + >>> query = defer_except(User, [User.id, User.name]) + + :param columns: columns not to deferred load + """ + model = query._entities[0].entity_zero.class_ + fields = set(model._sa_class_manager.values()) + for field in fields: + property_ = field.property + if isinstance(property_, ColumnProperty): + column = property_.columns[0] + if column.name not in columns: + query = query.options(defer(property_.key)) + return query + + def escape_like(string, escape_char='*'): """ Escapes the string paremeter used in SQL LIKE expressions