Thanks for your help!

I found the solution :) Instead of doing

dict_['id'] = Column(...)

I just do

cls.id = Column(...)

and it works. Kudos to the writer of this wiki entry
http://www.sqlalchemy.org/trac/wiki/UsageRecipes/AutoSequenceGeneration
. The comments in there led me to the solution finally.

-Matthias

On 27 Jul., 15:38, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Jul 27, 2011, at 2:12 AM, Matthias wrote:
>
>
>
>
>
> > Hello,
>
> > I'm currently writing my own version of the "magic" orm. I'd like it
> > to generate id columns automatically. I tried it like shown below.
>
> > When using the code I get an exception:
>
> > ArgumentError: Mapper Mapper|Version|version could not assemble any
> > primary key columns for mapped table 'Join object on content(55261328)
> > and version(64443600)'
>
> > The problem seems to be in the WithId metaclass. When I put an id =
> > Column(... primary = true) by hand on the Version class everything
> > works. I was expecting the metaclass to do the same, but apparently
> > there must be some difference,
>
> > Any idea how I can make the Base/Content/Version classes have id
> > columns (which work with polymorphism) automatically? I'd like to stay
> > away from mixin class all over the place.
>
> Without looking closely, just the usage of a metaclass is frequently very 
> difficult.  I know that you don't want to use a mixin, but why not specify 
> your class as part of the declarative base ?    
>
> Base = declarative_base(cls=WithIdBase)
>
> This question has come up at least twice, maybe three times, in the last few 
> weeks, so it seems as though the "mixin" section should get an explicit 
> section about "you can use them as the Base also" - right now its only in the 
> docstring.
>
> Another use case that was identified was that of base classes that are not 
> the "Base", but are in the middle of things.    We might add a function to 
> declarative_base to build such a base, something like   mybase = 
> declarative_base(cls=WithIdBase, derive_from_base=Base).   It would be a 
> small patch.
>
>
>
> > -Matthias
>
> > Code:
>
> > class WithId(DeclarativeMeta):
> >    def __init__(cls,classname, bases, dict_):
> >        if 'id' not in dict_:
> >            dict_['id'] = Column('id', Integer,
> > ForeignKey('content.id'), primary_key=True)
> >        DeclarativeMeta.__init__(cls, classname, bases, dict_)
>
> > Base = declarative_base(metaclass=WithId)
>
> > class Content(db.Base):
> >    id = db.Column('id', db.Integer, primary_key=True)
> >    type = db.Column(db.String(250))
>
> >    @classmethod
> >    def get_class_name(cls):
> >        '''Convert CamelCase class name to underscores_between_words
> >        table name.'''
> >        name = cls.__name__
> >        return (
> >            name[0].lower() +
> >            re.sub(r'([A-Z])', lambda m:"_" + m.group(0).lower(),
> > name[1:])
> >        )
>
> >    @db.declared_attr
> >    def __tablename__(cls):
> >        return cls.get_class_name()
>
> >    @db.declared_attr
> >    def __mapper_args__(cls):
> >        args = { 'polymorphic_identity' : cls.get_class_name() }
> >        ContentClass = cls.__bases__[-1]
> >        if ContentClass is db.Base:
> >            args['polymorphic_on'] = cls.type
> >        else:
> >            args['inherit_condition'] = (cls.id == ContentClass.id)
> >        return args
>
> > class Version(Content):
> >    timestamp = Column(DateTime, default=datetime.datetime.now)
> >    message = Column(UnicodeText)
> >    #author = attribute(User, backref =
> > collectionAttribute('authoredVersions'))
>
> > --
> > 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 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

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