]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Class-bound accessor can be used as the argument to
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 27 Dec 2008 18:34:54 +0000 (18:34 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 27 Dec 2008 18:34:54 +0000 (18:34 +0000)
relation() order_by.  [ticket:939]

CHANGES
lib/sqlalchemy/orm/properties.py
test/ext/declarative.py

diff --git a/CHANGES b/CHANGES
index 457c7fc0a1f33fb47078cf95ca1eb50c26c01abd..88e316ae7eea43783fb81ce898e006fc8439b253 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -23,6 +23,10 @@ CHANGES
       composite type from being mutated [ticket:1213].
 
     - Added ScopedSession.is_active accessor. [ticket:976]
+    
+    - Class-bound accessor can be used as the argument to 
+      relation() order_by.  [ticket:939]
+      
 - sql
     - Connection.invalidate() checks for closed status 
       to avoid attribute errors. [ticket:1246]
index 06fc9926c2e52d5199ddd86f1a735781844028a2..19ec2318795f50207c732033979cf7ff1b05c13b 100644 (file)
@@ -501,6 +501,9 @@ class PropertyLoader(StrategizedProperty):
         self.target = self.mapper.mapped_table
         self.table = self.mapper.mapped_table
 
+        if self.order_by:
+            self.order_by = [expression._literal_as_column(x) for x in util.to_list(self.order_by)]
+
         if self.cascade.delete_orphan:
             if self.parent.class_ is self.mapper.class_:
                 raise exceptions.ArgumentError("In relationship '%s', can't establish 'delete-orphan' cascade "
index b84ee5a7f8699141974c4c39ee2b1b2dd3ad3eca..ee7a1a21a66f630eff7b562eed7ea9cda147327d 100644 (file)
@@ -172,6 +172,35 @@ class DeclarativeTest(TestBase, AssertsExecutionResults):
         self.assertEquals(a1, Address(email='two'))
         self.assertEquals(a1.user, User(name='u1'))
 
+    def test_eager_order_by(self):
+        class Address(Base, Fixture):
+            __tablename__ = 'addresses'
+
+            id = Column('id', Integer, primary_key=True)
+            email = Column('email', String(50))
+            user_id = Column('user_id', Integer, ForeignKey('users.id'))
+
+        class User(Base, Fixture):
+            __tablename__ = 'users'
+
+            id = Column('id', Integer, primary_key=True)
+            name = Column('name', String(50))
+            addresses = relation("Address", order_by=Address.email)
+
+        Base.metadata.create_all()
+        u1 = User(name='u1', addresses=[
+            Address(email='two'),
+            Address(email='one'),
+        ])
+        sess = create_session()
+        sess.add(u1)
+        sess.flush()
+        sess.clear()
+        self.assertEquals(sess.query(User).options(eagerload(User.addresses)).all(), [User(name='u1', addresses=[
+            Address(email='one'),
+            Address(email='two'),
+        ])])
+
     
     def test_custom_mapper(self):
         class MyExt(MapperExtension):
@@ -208,7 +237,7 @@ class DeclarativeTest(TestBase, AssertsExecutionResults):
             assert Foo.__mapper__.compile().extension.create_instance() == 'CHECK'
 
 
-    def test_oops(self):
+    def test_errant_comma(self):
         def define():
             class User(Base, Fixture):
                 __tablename__ = 'users'
@@ -220,7 +249,7 @@ class DeclarativeTest(TestBase, AssertsExecutionResults):
             exceptions.ArgumentError,
             "Mapper Mapper|User|users could not assemble any primary key",
             define)
-    test_oops = testing.emits_warning('Ignoring declarative-like tuple value of attribute id')(test_oops)
+    test_errant_comma = testing.emits_warning('Ignoring declarative-like tuple value of attribute id')(test_errant_comma)
 
     def test_expression(self):
         class User(Base, Fixture):