People can use string-based "primaryjoin" parameter to define the "sqlalchemy.orm.relation" instance if people use declarative base class. But the "__table__" attribute is not available. Look at this example.
Chassis and Blade are sub-class of System. The "sysid" property shares the same name in parent and children classes. And there is one- to-many relationship between Chassis and Blade. So for example I have to use "Chassis.__table__.c.sysid" instead of "Chassis.sysid" to define join condition. The error line marked "##### error happens #####" can cause following exception. I know work-around, like renaming "sysid", or using Python clause instead of string in "primaryjoin" parameter and defining "relation" outside class definition. But I wonder whether it is problem or is by design. Anyone can help? Thx! p.s. my sqlalchemy is latest 0.6 (changeset: 6410:09e0ec53d4d0) ###################################### # exception ###################################### File "d:\program\src\python\sqlalchemy\lib\sqlalchemy\orm \mapper.py", line 822, in _get_property raise sa_exc.InvalidRequestError("Mapper '%s' has no property '%s'" % (str(self), key)) InvalidRequestError: Mapper 'Mapper|Chassis|tbl_chassis' has no property '__table__' ###################################### # code ###################################### from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import (Column, ForeignKey, Integer, String) from sqlalchemy.orm import relation SYS_TYPE_UNKNOWN = 0 SYS_TYPE_CHASSIS = 1 SYS_TYPE_BLADE = 2 Base = declarative_base() class System(Base): '''Generic system''' __tablename__ = 'tbl_system' sysid = Column(Integer, primary_key=True, autoincrement=True) sys_type = Column(Integer) __mapper_args__ = {'polymorphic_on': sys_type, 'polymorphic_identity': SYS_TYPE_UNKNOWN} class Chassis(System): '''BladeCenter Chassis''' __tablename__ = 'tbl_chassis' __mapper_args__ = {'polymorphic_identity': SYS_TYPE_CHASSIS} sysid = Column(Integer, ForeignKey('tbl_system.sysid'), primary_key=True) ##### error happens ##### blades = relation('Blade', primaryjoin='Chassis.__table__.c.sysid == Blade.chassis_sysid', backref='chassis') class Blade(System): '''Blade server''' __tablename__ = 'tbl_blade' __mapper_args__ = {'polymorphic_identity': SYS_TYPE_BLADE} sysid = Column(Integer, ForeignKey('tbl_system.sysid'), primary_key=True) chassis_sysid = Column(Integer, ForeignKey('tbl_chassis.sysid')) if __name__ == '__main__': ch1 = Chassis() -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.