]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
restore slice methods to dynamic query
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 22 Sep 2020 00:17:04 +0000 (20:17 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 22 Sep 2020 00:17:04 +0000 (20:17 -0400)
in f0f08db5715e41cc08e57dbc76a85300b these got
lost, put them back and test

Change-Id: Id1962e1f5d6160fe222becec5a8e32ec6a40017a

lib/sqlalchemy/orm/dynamic.py
test/orm/test_dynamic.py

index 41d0fabd23a2b1a4c9110ee771edabcc88b689a4..af67b477262f9623a424ead9f6906fa4d27d1902 100644 (file)
@@ -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
         )
index 27883a5dedcc5dbc923dcf40150b8c81f0e381c6..836d9f88ccb33b5b8edcd73a7fa8a574cb8a357c 100644 (file)
@@ -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."""