Hi,
We've used joined table inheritance up to this point, but performance issues are making us explore single table inheritance. I'm running into a problem with mapper configuration. Using SQLAlchemy 0.7.8, Flask-SQLAlchemy 0.16, and Flask 0.8. Here is the inheritance:
class Community(BaseModel, db.Model):
# Bar
class Group(Community):
###
Group utilized joined table inheritance to extend Community
###
id = db.Column(db.Integer, db.ForeignKey('
community.id'), primary_key=True, nullable=False)
autocreated = db.Column(db.Boolean, nullable=False, default=False)
@declared_attr
def __mapper_args__(cls):
name = cls._name()
identity = {
'polymorphic_on': case([
(cls.autocreated == True, "autocreated_group"),
(cls.autocreated == False, "group")
]),
'polymorphic_identity': name
}
return identity
class AutocreatedGroup(Group):
###
AutocreatedGroup extends Group through joined table inheritance
###
id = db.Column(db.Integer, db.ForeignKey('
group.id'), primary_key=True, \
nullable=False)
@declared_attr
def __mapper_args__(cls):
name = cls._name()
identity = {
'polymorphic_on': cls.autocreated_type,
'polymorphic_identity': name
}
return identity
class TopicAutocreatedGroup(AutocreatedGroup):
###
TopicAutocreatedGroup extends AutocreatedGroup through single table inheritance
###
@declared_attr
def __mapper_args__(cls):
return {'polymorphic_identity': cls._name()}
topic_created_from_id = db.Column(
db.Integer,
nullable = True
)
topic_created_from = db.relation(
"Topic",
primaryjoin="Topic.id == TopicAutocreatedGroup.topic_created_from_id",
backref=db.backref("topic_groups", uselist=True),
uselist=False, lazy='subquery'
)
Here is the stacktrace:
Traceback (most recent call last):
File "/srv/.env/lib/python2.6/site-packages/flask/app.py", line 1518, in __call__
return self.wsgi_app(environ, start_response)
File "/srv/.env/lib/python2.6/site-packages/flask/app.py", line 1506, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/srv/.env/lib/python2.6/site-packages/flask/app.py", line 1504, in wsgi_app
response = self.full_dispatch_request()
File "/srv/.env/lib/python2.6/site-packages/flask/app.py", line 1264, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/srv/.env/lib/python2.6/site-packages/flask/app.py", line 1260, in full_dispatch_request
rv = self.preprocess_request()
File "/srv/.env/lib/python2.6/site-packages/flask/app.py", line 1387, in preprocess_request
rv = func()
File "/srv/franklin-api/api/helpers/login_manager.py", line 53, in _load_user
user = User.for_auth_token(token)
File "/srv/franklin-api/api/models/user.py", line 584, in for_auth_token
user_for_token = cls.query.filter(cls.auth_token == auth_token).first()
File "/srv/.env/lib/python2.6/site-packages/flask_sqlalchemy.py", line 394, in __get__
mapper = orm.class_mapper(type)
File "/srv/.env/lib/python2.6/site-packages/sqlalchemy/orm/util.py", line 660, in class_mapper
mapperlib.configure_mappers()
File "/srv/.env/lib/python2.6/site-packages/sqlalchemy/orm/mapper.py", line 2255, in configure_mappers
raise e
InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Class <class 'api.models.autocreated_group.TopicAutocreatedGroup'> does not have a mapped column named 'topic_created_from_id'
It appears the Columns inside classes that inherit through single table inheritance are not included in the mapper. Any idea of what may be going wrong?
Thank you,
Kuba
P.S. What should __mapper_args__ look like for AutocreatedGroup? Should "topic_created_from_id" be automatically included in the "excluded_properties" value? Currently, it's empty if I print it out.