From: Mike Bayer Date: Sat, 12 Sep 2009 20:28:10 +0000 (+0000) Subject: - Table objects declared in the MetaData can now be used X-Git-Tag: rel_0_6beta1~285 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75848ce2c82626707fbb1329c7197637579c0b95;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Table objects declared in the MetaData can now be used in string expressions sent to primaryjoin/secondaryjoin/ secondary - the name is pulled from the MetaData of the declarative base. [ticket:1527] --- diff --git a/CHANGES b/CHANGES index d3a5fb2e17..efa34454c9 100644 --- a/CHANGES +++ b/CHANGES @@ -504,6 +504,11 @@ CHANGES __table_args__ is passed as a tuple with no dict argument. Improved documentation. [ticket:1468] + - Table objects declared in the MetaData can now be used + in string expressions sent to primaryjoin/secondaryjoin/ + secondary - the name is pulled from the MetaData of the + declarative base. [ticket:1527] + - A column can be added to a joined-table subclass after the class has been constructed (i.e. via class-level attribute assignment). The column is added to the underlying diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index c37211ac3d..80faea36b2 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -600,9 +600,11 @@ def _deferred_relation(cls, prop): import sqlalchemy def access_cls(key): - try: + if key in cls._decl_class_registry: return _GetColumns(cls._decl_class_registry[key]) - except KeyError: + elif key in cls.metadata.tables: + return cls.metadata.tables[key] + else: return sqlalchemy.__dict__[key] d = util.PopulateDict(access_cls) diff --git a/test/ext/test_declarative.py b/test/ext/test_declarative.py index b64ad23e1c..16a0d697f4 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -175,7 +175,31 @@ class DeclarativeTest(DeclarativeTestBase): compile_mappers() eq_(str(User.addresses.property.primaryjoin), str(Address.user.property.primaryjoin)) + def test_string_dependency_resolution_tables(self): + class User(Base, ComparableEntity): + __tablename__ = 'users' + id = Column(Integer, primary_key=True) + name = Column(String(50)) + + props = relation("Prop", + secondary="user_to_prop", + primaryjoin="User.id==user_to_prop.c.user_id", + secondaryjoin="user_to_prop.c.prop_id==Prop.id", + backref="users") + + class Prop(Base, ComparableEntity): + __tablename__ = 'props' + id = Column(Integer, primary_key=True) + name = Column(String(50)) + user_to_prop = Table('user_to_prop', Base.metadata, + Column('user_id', Integer, ForeignKey('users.id')), + Column('prop_id', Integer, ForeignKey('props.id')), + ) + + compile_mappers() + assert class_mapper(User).get_property("props").secondary is user_to_prop + def test_uncompiled_attributes_in_relation(self): class Address(Base, ComparableEntity): __tablename__ = 'addresses'