summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-09-21 20:17:04 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2020-09-21 20:17:04 -0400
commit277c6ca679729b36b5d19c9a1b2949a672c50f46 (patch)
tree1ec8def4b1e2535bd01fc1e31bf201565e307a11
parent73ab000007bd25ac86ca2081868615c6c4820531 (diff)
downloadsqlalchemy-277c6ca679729b36b5d19c9a1b2949a672c50f46.tar.gz
restore slice methods to dynamic query
in f0f08db5715e41cc08e57dbc76a85300b these got lost, put them back and test Change-Id: Id1962e1f5d6160fe222becec5a8e32ec6a40017a
-rw-r--r--lib/sqlalchemy/orm/dynamic.py13
-rw-r--r--test/orm/test_dynamic.py11
2 files changed, 23 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py
index 41d0fabd2..af67b4772 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 27883a5de..836d9f88c 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."""