On Feb 23, 2012, at 9:56 AM, lars van gemerden wrote:

> Hi all,
> 
> I reproduced an error I was having with the code below (basically
> pasted from the tutorial for joined inheritance) and added an
> 'inherit_condition' to __mapper_args__ of the subclass. At that point
> the code started throwing a sqlalchemy.exc.InterfaceError. The code
> is:
> 
> class Person(Base):
>    __tablename__ = 'Person'
>    id = Column(Integer, primary_key=True)
>    discriminator = Column('type', String(50))
>    __mapper_args__ = {'polymorphic_on': discriminator}
> 
> 
> class Engineer(Person):
>    __tablename__ = 'Engineer'
>    __mapper_args__ = {'polymorphic_identity': 'Engineer',
> 'inherit_condition': (id == Person.id)}
>    id = Column(Integer, ForeignKey('Person.id'), primary_key=True)

Well OK, right here, when you say "id", that's the Python built-in function 
"id()".   This because the name "id" has not yet been assigned to point to your 
new Column object.   The "class Engineer(Person):" is just another Python 
block, just like an "if <condition>:" statement.   So yes, in that case you 
need to ensure "id" is pointing to that Column before you stick it into the 
"inherit_condition".    This has nothing to do with the order of things being 
looked at in the actual "dict" of the class, just the order of how Python is 
assigning meaning to the name "id" within the "class:" block.

The declarative tutorial doesn't have this bug, but yes I can see we might be 
better off illustrating __mapper_args__ at the bottom of the class declaration 
just to make this kind of error less likely.


> 
> Now we get to the problem: In my code I dynamically generate tables
> with type(name, (base,), dicty). In dicty are the __mapper_args__  and
> id Column. Because of the dictionary used I have no control over the
> order of the arguments and that seems to cause my exception.

I'm not getting how you'd have this issue there - you of course have total 
control over what goes into a dict() to use with type(), and in what order 
(it's only on the "taking things out" part of a dict that is not ordered).  You 
should generate the Column object, then you put it in the dictionary.   The 
"id" builtin function never gets involved:


id = Column(...)
dict = {
    'id':id,
   '__mapper_args__':{'inherit_condition':id==Person.id}
}


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

Reply via email to