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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.