From: Mike Bayer Date: Thu, 22 Feb 2007 22:59:51 +0000 (+0000) Subject: - a full select() construct can be passed to query.select() (which X-Git-Tag: rel_0_3_6~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0b72859f96de082021a8928c2600da241369151;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - a full select() construct can be passed to query.select() (which worked anyway), but also query.selectfirst(), query.selectone() which will be used as is (i.e. no query is compiled). works similarly to sending the results to instances(). --- diff --git a/CHANGES b/CHANGES index f4d0646b94..921c06a416 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +- orm: + - a full select() construct can be passed to query.select() (which + worked anyway), but also query.selectfirst(), query.selectone() which + will be used as is (i.e. no query is compiled). works similarly to + sending the results to instances(). 0.3.5 - sql: - the value of "case_sensitive" defaults to True now, regardless of the diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index bf64266388..dd3196c202 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -213,19 +213,22 @@ class Query(object): The criterion is constructed in the same way as the select_by() method.""" return self.count(self.join_by(*args, **params)) - def selectfirst(self, *args, **params): + def selectfirst(self, arg=None, **kwargs): """works like select(), but only returns the first result by itself, or None if no objects returned.""" - params['limit'] = 1 - ret = self.select_whereclause(*args, **params) + if isinstance(arg, sql.FromClause) and arg.supports_execution(): + ret = self.select_statement(arg, **kwargs) + else: + kwargs['limit'] = 1 + ret = self.select_whereclause(whereclause=arg, **kwargs) if ret: return ret[0] else: return None - def selectone(self, *args, **params): + def selectone(self, arg=None, **kwargs): """works like selectfirst(), but throws an error if not exactly one result was returned.""" - ret = list(self.select(*args, **params)[0:2]) + ret = list(self.select(arg, **kwargs)[0:2]) if len(ret) == 1: return ret[0] elif len(ret) == 0: @@ -247,7 +250,7 @@ class Query(object): ret = self.extension.select(self, arg=arg, **kwargs) if ret is not mapper.EXT_PASS: return ret - if isinstance(arg, sql.FromClause): + if isinstance(arg, sql.FromClause) and arg.supports_execution(): return self.select_statement(arg, **kwargs) else: return self.select_whereclause(whereclause=arg, **kwargs)