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 [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
-~----------~----~----~----~------~----~------~--~---