summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2020-09-22 01:54:52 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2020-09-22 01:54:52 +0000
commite973fd5d5712b7212624b329015633fecfd1a25c (patch)
tree95bdfdc3d25f8e05df3f36908437ba6624b00c13
parent0d1efeec475621b5c2c2aca0632b02edef54c1a6 (diff)
parent277c6ca679729b36b5d19c9a1b2949a672c50f46 (diff)
downloadsqlalchemy-e973fd5d5712b7212624b329015633fecfd1a25c.tar.gz
Merge "restore slice methods to dynamic query"
-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."""