Awesome, thanks a ton for the update and fix. On Tuesday, April 9, 2013 11:25:44 AM UTC-7, Michael Bayer wrote: > > thanks, now I know what you mean by "the class will now have a table > attached to it". This behavior is a side effect of the issue raised in > http://www.sqlalchemy.org/trac/ticket/2656 (which also applies to 0.7), > but since __mapper_args__() is evaluated later, this turns it into more or > less of a regression, issue is fixed in > r4ddeed7a3248<http://www.sqlalchemy.org/trac/changeset/4ddeed7a3248/> > . > > > > On Apr 9, 2013, at 1:31 PM, Gerald Thibault > <diesel...@gmail.com<javascript:>> > wrote: > > Here is a test. It's possible the failure is because the provided example > uses a mixin, while i am declaring directly on the base class. > > from sqlalchemy import * > from sqlalchemy.ext.declarative import (declarative_base, > declared_attr, has_inherited_table) > > Base = declarative_base() > > class Test(Base): > __tablename__ = 'test' > id = Column(Integer, primary_key=True) > type = Column(String(20)) > > @declared_attr > def __mapper_args__(cls): > if not has_inherited_table(cls): > ret = { > 'polymorphic_identity': 'default', > 'polymorphic_on': cls.type, > } > else: > ret = {'polymorphic_identity': cls.__name__} > print '%s.__mapper_args__:' % cls > print ret > return ret > > class PolyTest(Test): > __tablename__ = 'poly_test' > id = Column(Integer, ForeignKey(Test.id), primary_key=True) > > Running this under 0.7.9 produces: > > <class '__main__.Test'>.__mapper_args__: > {'polymorphic_identity': 'default', 'polymorphic_on': Column(None, > String(length=20), table=None)} > <class '__main__.Test'>.__mapper_args__: > {'polymorphic_identity': 'default', 'polymorphic_on': Column(None, > String(length=20), table=None)} > <class '__main__.PolyTest'>.__mapper_args__: > {'polymorphic_identity': 'PolyTest'} > > Running under 0.8.0 produces: > > <class '__main__.Test'>.__mapper_args__: > {'polymorphic_identity': 'Test'} > <class '__main__.PolyTest'>.__mapper_args__: > {'polymorphic_identity': 'PolyTest'} > > in 7.9, the polymorphic_on was set correctly, in 8.0 the table already > exists when the mapper_args are processed (because it's a lambda now), so > has_inherited_table returns True. Is it intended behavior to have > has_inherited_table return true when the only "inherited" table is that on > the class itself? I am working around this by using my own > has_inherited_table method, which first checks if the base is equal to the > active class, and skipping it if they're the same. It seems this should be > default behavior, unless i am misunderstanding what 'inherited' is > representing here. > > Is there a way to accomplish what I'm trying to do without setting up my > own has_inherited_table function? > > > On Thursday, April 19, 2012 3:23:54 AM UTC-7, lars van gemerden wrote: >> >> I am trying to my my joined inheritance code clearer, for the dynamic >> generation of sa classes and tried to do something like this: >> >> >> class InheritMixin(object): >> >> @declared_attr >> def __tablename__(cls): >> return cls.__name__ >> @declared_attr >> def id(cls): >> if cls.__name__ == 'Object': >> return Column(Integer, primary_key = True) >> else: >> print 'in id: ', cls.__name__, cls.__bases__[0].__name__ >> return Column(Integer, >> ForeignKey(cls.__bases__[0].__name__ + '.id'), primary_key = True) >> @declared_attr >> def __mapper_args__(cls): >> if cls.__name__ == 'Object': >> return {'polymorphic_on': 'discriminator'} >> else: >> print 'in mapper_args: ', cls.__name__, >> cls.__bases__[0].__name__ >> return {'polymorphic_identity': cls.__name__, >> 'inherit_condition': (cls.id == >> cls.__bases__[0].id)} >> >> Object = type('Object', (Base, InheritMixin), clsdict) >> >> Where Object should be the (not necessarily direct) baseclass of all >> inheriting classes. However I get errors: "Mapper Mapper|person|person >> could not assemble any primary key columns for mapped table 'Join >> object on Object(65389120) and person(65428224)' " etc .. >> >> I noticed that the method __mapper_args__(cls) is always called before >> id(cls) (which is never called, probably due to the error. >> >> Is there some way to fix this, while keeping the inheritance code in a >> mixin? >> >> Also, is there a way to add the discriminator column to the mixin (if >> i just directly add it to the declaration, this gave another maybe >> related error)? >> >> Cheers, Lars >> > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com<javascript:> > . > Visit this group at http://groups.google.com/group/sqlalchemy?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > > > >
-- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy?hl=en. For more options, visit https://groups.google.com/groups/opt_out.