From: Mike Bayer Date: Tue, 22 Sep 2020 00:17:04 +0000 (-0400) Subject: restore slice methods to dynamic query X-Git-Tag: rel_1_4_0b1~84^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=277c6ca679729b36b5d19c9a1b2949a672c50f46;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git restore slice methods to dynamic query in f0f08db5715e41cc08e57dbc76a85300b these got lost, put them back and test Change-Id: Id1962e1f5d6160fe222becec5a8e32ec6a40017a --- diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py index 41d0fabd23..af67b47726 100644 --- a/lib/sqlalchemy/orm/dynamic.py +++ b/lib/sqlalchemy/orm/dynamic.py @@ -27,6 +27,7 @@ from .. import sql from .. import util from ..engine import result as _result from ..sql import selectable +from ..sql import util as sql_util from ..sql.base import _generative from ..sql.base import Generative @@ -511,18 +512,28 @@ class AppenderQuery(Generative): else: return orm_util._getitem(self, index) + @_generative + def limit(self, limit): + self._statement = self._statement.limit(limit) + + @_generative + def offset(self, offset): + self._statement = self._statement.offset(offset) + + @_generative def slice(self, start, stop): """Computes the "slice" represented by the given indices and apply as LIMIT/OFFSET. """ - limit_clause, offset_clause = orm_util._make_slice( + limit_clause, offset_clause = sql_util._make_slice( self._statement._limit_clause, self._statement._offset_clause, start, stop, ) + self._statement = self._statement.limit(limit_clause).offset( offset_clause ) diff --git a/test/orm/test_dynamic.py b/test/orm/test_dynamic.py index 27883a5ded..836d9f88cc 100644 --- a/test/orm/test_dynamic.py +++ b/test/orm/test_dynamic.py @@ -149,6 +149,17 @@ class DynamicTest(_DynamicFixture, _fixtures.FixtureTest, AssertsCompiledSQL): q.filter_by(id=7).all(), ) + def test_slice_access(self): + User, Address = self._user_address_fixture() + sess = create_session() + u1 = sess.get(User, 8) + + eq_(u1.addresses.limit(1).one(), Address(id=2)) + + eq_(u1.addresses[0], Address(id=2)) + eq_(u1.addresses[0:2], [Address(id=2), Address(id=3)]) + eq_(u1.addresses[-1], Address(id=4)) + def test_statement(self): """test that the .statement accessor returns the actual statement that would render, without any _clones called."""