From: Mike Bayer Date: Sat, 12 Sep 2009 20:37:43 +0000 (+0000) Subject: merged r6342 from trunk for [ticket:1527] X-Git-Tag: rel_0_5_6~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21399d2042418f6ee010c78219542742ff2e2313;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git merged r6342 from trunk for [ticket:1527] --- diff --git a/CHANGES b/CHANGES index 2ed260a4c1..d19085c00f 100644 --- a/CHANGES +++ b/CHANGES @@ -127,6 +127,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 07974cacce..77dbcaf781 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 f487778869..bb4c616a64 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -176,7 +176,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'