its likely a bug.  there are some boolean tests for  
"polymorphic_identity" in mapper.py which should be changed to "is  
None".


On Jan 30, 2009, at 11:58 AM, Gunnlaugur Thor Briem wrote:

> Hi,
>
> [trying to send this again, seems like previous copy got lost in  
> some moderation queue]
>
> Messing with single-table inheritance in a declarative model, with a  
> non-abstract base class, I find that querying fails if  
> polymorphic_identity is 0 (zero). Example:
>
> ################ code begins ################
> from sqlalchemy import Column, Integer, create_engine
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import sessionmaker
>
> Base = declarative_base()
> class Course(Base):
>     __tablename__ = 'course'
>     id = Column(Integer, primary_key=True)
>     course_type = Column(Integer)
>     __mapper_args__ = {'polymorphic_on':course_type,  
> 'polymorphic_identity':0}
>
> class MultiYearCourse(Course):
>     __mapper_args__ = {'polymorphic_identity':1}
>
> engine = create_engine('sqlite:///:
> memory:')
> Base.metadata.create_all(bind=engine)
> session = sessionmaker(bind=engine)()
>
> myc = MultiYearCourse()
> myc.name = u"Computer Graphics"
> c = Course()
> c.name = u"Sociology"
> session.add(c)
> session.add(myc)
> session.commit()
>
> print "MYC:     %s" % myc
> print "C:       %s" % c
> query = session.query(Course)
> print "Query:   %s" % query
> print "Results: %s" % query.all()
> ################ code ends ################
>
> That last line fails with an AssertionError:
>
> ################ output begins ################
> MYC:     <__main__.MultiYearCourse object at 0xcf7d30>
> C:       <__main__.Course object at 0xcf7d70>
> Query:   SELECT course.id AS course_id, course.course_type AS  
> course_course_type
> FROM course
> Traceback (most recent call last):
>   File "/Users/gthb/Documents/workspace/test/src/sqlalchemytest.py",  
> line 31, in <module>
>     print "Results: %s" % query.all()
>   File "/Users/gthb/Library/Python/2.5/site-packages/ 
> SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/orm/query.py", line 1186, in all
>     return list(self)
>   File "/Users/gthb/Library/Python/2.5/site-packages/ 
> SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/orm/query.py", line 1341, in  
> instances
>     rows = [process[0](context, row) for row in fetch]
>   File "/Users/gthb/Library/Python/2.5/site-packages/ 
> SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/orm/query.py", line 1942, in  
> main
>     return _instance(row, None)
>   File "/Users/gthb/Library/Python/2.5/site-packages/ 
> SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/orm/mapper.py", line 1557, in  
> _instance
>     _instance = polymorphic_instances[discriminator]
>   File "/Users/gthb/Library/Python/2.5/site-packages/ 
> SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/util.py", line 71, in  
> __missing__
>     self[key] = val = self.creator(key)
>   File "/Users/gthb/Library/Python/2.5/site-packages/ 
> SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/orm/mapper.py", line 1695, in  
> configure_subclass_mapper
>     raise AssertionError("No such polymorphic_identity %r is  
> defined" % discriminator)
> AssertionError: No such polymorphic_identity 0 is defined
> ################ output ends ################
>
> But if I exchange the polymorphic identities, so the base class gets  
> the 1 and the subclass gets the 0, then it runs just fine!
>
> It seems to me that this can't be intentional — don't see a reason  
> for it, and the docs do not mention any particular restrictions on  
> values of polymorphic_identity.
>
> Regards,
>
>     - Gulli
>
> >


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@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
-~----------~----~----~----~------~----~------~--~---

Reply via email to