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