From: Mike Bayer Date: Sat, 27 Dec 2008 18:34:54 +0000 (+0000) Subject: - Class-bound accessor can be used as the argument to X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53a86f05355060ffef862ad85050e90b3f4c3884;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Class-bound accessor can be used as the argument to relation() order_by. [ticket:939] --- diff --git a/CHANGES b/CHANGES index 457c7fc0a1..88e316ae7e 100644 --- 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] diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 06fc9926c2..19ec231879 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -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 " diff --git a/test/ext/declarative.py b/test/ext/declarative.py index b84ee5a7f8..ee7a1a21a6 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -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):