On Nov 27, 2013, at 1:23 AM, 史永宏 <shooting...@gmail.com> wrote:

> Hi,
> Is there a solution for this issue today? Now I have a single table 
> Inheritance in table A, however, the type information is stored in another 
> table B linked from A with foreign key...
> Now if I want to get polymorphic result when querying A, I got error ask me 
> to either use polymorphic or set enable_typechecks to False. 
> Any idea how to solve this? (After 3+ years)?

this was solved two years ago, I failed to put a full migration doc for it but 
here’s the changelog:

http://docs.sqlalchemy.org/en/rel_0_9/changelog/changelog_07.html#change-dc3aefb201de941ad86706e78e661813

[orm] [feature] polymorphic_on now accepts many new kinds of values:

standalone expressions that aren’t otherwise mapped
column_property() objects
string names of any column_property() or attribute name of a mapped Column

I just wrote an example for someone but as usual I can’t find it, so here it is 
again:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class AType(Base):
    __tablename__ = 'atype'

    id = Column(Integer, primary_key=True)
    name = Column(String)

class A(Base):
    __tablename__ = 'a'

    id = Column(Integer, primary_key=True)
    data = Column(String)
    type_id = Column(ForeignKey('atype.id'))
    type_name = column_property(select([AType.name]).where(AType.id == id))
    type = relationship(AType)

    __mapper_args__ = {
        "polymorphic_on": type_name,
        "polymorphic_identity": "a"
    }

class ASub(A):
    __tablename__ = 'asub'

    id = Column(ForeignKey('a.id'), primary_key=True)
    __mapper_args__ = {
        "polymorphic_identity": "asub"
    }

e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

sess = Session(e)

a_type, asub_type = AType(name="a"), AType(name="asub")

sess.add_all([
    A(data='a1', type=a_type),
    ASub(data='asub1', type=asub_type),
    ASub(data='asub2', type=asub_type),
    A(data='a2', type=a_type),
])
sess.commit()

sess = Session(e)
for a in sess.query(A):
    print a.data, a.type



> 
> On Thursday, May 20, 2010 12:22:34 PM UTC-7, Richard K wrote:
> Hi Timmy and Michael,
> 
> I was wandering here about the same problem. I have a table that defines keys 
> and value type (ie: key 'username', type 'unicode max 60' - that it is a 
> constant).
> 
> Then, I have the values table, which is polymorphic on value type and also 
> has a fk to keys table. I think it is a bit lame to duplicate value type in 
> those two tables, and also not that useful to use the polymorphic as a 
> "static" value on each record of value table since I already have it on keys 
> table. By having a fk to keys table, can't I get the polymorphic value from 
> there?
> 
> Thanks in advance,
> Richard.
> 
> On Wed, May 5, 2010 at 6:47 PM, Timmy Chan <timmy....@gmail.com> wrote:
> thx, that is what i am wondering.  they are one-to-one, maybe thats good 
> enough for performance.  so there's no easy way to do this.
> 
> 
> On Wed, May 5, 2010 at 5:44 PM, Michael Bayer <mik...@zzzcomputing.com> wrote:
> 
> I meant SQL.    if you want to do polymorphic_on based on "a.type" it would 
> at the very least need to issue:
> 
> SELECT c.*, a.type JOIN b ON c.b_id = b.id JOIN a ON b.a_id=a
> 
> which is an expensive way to get to where you're going.   It can be done of 
> course but not through relation().
> 
> 
> On May 5, 2010, at 5:36 PM, Timmy Chan wrote:
> 
>> "C"/"D" objects doesn't exist without "A" and "B"?  maybe walk up the graph: 
>>  C.b.a.type
>> 
>> im not sure this schema is sensible, if it's really bad, please advise, im 
>> not attached to it!
>> 
>> thax!
>> 
>> On Wed, May 5, 2010 at 5:28 PM, Michael Bayer <mik...@zzzcomputing.com> 
>> wrote:
>> what query do you want to see when you select "C" and "D" objects ?
>> 
>> 
>> 
>> On May 5, 2010, at 5:26 PM, Timmy Chan wrote:
>> 
>>> thx, is there a way to set that up, or something similar?
>>> 
>>> after giving it thought, maybe polymorphic_on isn't what i need.  in some 
>>> sense, table "A" is similar to a generic container, and i want to constrain 
>>> the type of "C" depending on "A"'s type column.  is there a way to do this?
>>> 
>>> On Wed, May 5, 2010 at 5:15 PM, Michael Bayer <mik...@zzzcomputing.com> 
>>> wrote:
>>> 
>>> On May 5, 2010, at 5:01 PM, Timmy Chan wrote:
>>> 
>>>> i have 4 tables, a, b, c, d.
>>>> 
>>>> a has one-to-many relation with b, b with one-to-one relationship with c, 
>>>> c is a polymorphic on a.type, with d being one of the polymorphic types.
>>>> 
>>>> is there a way to implement this?
>>>> 
>>>> details:
>>>> 
>>>> this is what im trying to do in sqlalchemy:
>>>> 
>>>>     a = Table('a', metadata,
>>>>               Column( 'id', Integer(), primary_key=True ),
>>>>               Column( 'type', UnicodeText() ) )
>>>> 
>>>>     b = Table('b', metadata,
>>>>               Column( 'id', Integer(), primary_key=True ),
>>>>               Column( 'a_id', Integer(), ForeignKey('a.id') ) )
>>>> 
>>>>     c = Table('c', metadata,
>>>>               Column( 'id', Integer(), primary_key=True ),
>>>>               Column( 'b_id', Integer(), ForeignKey('b.id') ),
>>>>               Column( 'class_id', Integer() ) )
>>>>       
>>>>     d = Table('d', metadata,
>>>>               Column( 'id', Integer(), primary_key=True ),
>>>>               Column( 'data', Integer() )
>>>> 
>>>> mappers
>>>> 
>>>>     mapper( A, a )
>>>>     mapper( B, b, properties={'a': relationship( A, 
>>>> uselist=False,backref='b',
>>>>            'c':relationship( C, uselist=False, backref='b') })
>>>> 
>>>>     # Does a full join, does not work
>>>>     mapper( C, c, polymorphic_on = a.c.type )
>>>>     mapper( D, d, inherits=C, polymorphic_identity = "D" )
>>>> 
>>>> 
>>>> how can i change c to polymorphic on a, through the relationship?   is 
>>>> there a way to sort by d.data?  (b-c/d is one-on-one).
>>> 
>>> this mapping is incorrect.     mapper(C) cannot be polymorphic on a table 
>>> which is not part of its mapping, and mapper(C) does not contain an 
>>> "inherits" keyword to that of A.   Usually the "polymorphic_on" setting is 
>>> on the base-most mapper in the hierarchy and its not clear here which 
>>> mapper you intend for that to be.
>>> 
>>> 
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "sqlalchemy" group.
>>> To post to this group, send email to sqlal...@googlegroups.com.
>>> To unsubscribe from this group, send email to 
>>> sqlalchemy+...@googlegroups.com.
>>> For more options, visit this group at 
>>> http://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 sqlal...@googlegroups.com.
>>> To unsubscribe from this group, send email to 
>>> sqlalchemy+...@googlegroups.com.
>>> For more options, visit this group at 
>>> http://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 sqlal...@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> sqlalchemy+...@googlegroups.com.
>> For more options, visit this group at 
>> http://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 sqlal...@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> sqlalchemy+...@googlegroups.com.
>> For more options, visit this group at 
>> http://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 sqlal...@googlegroups.com.
> To unsubscribe from this group, send email to sqlalchemy+...@googlegroups.com.
> For more options, visit this group at 
> http://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 sqlal...@googlegroups.com.
> To unsubscribe from this group, send email to sqlalchemy+...@googlegroups.com.
> For more options, visit this group at 
> http://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 sqlal...@googlegroups.com.
> To unsubscribe from this group, send email to sqlalchemy+...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 
> -- 
> 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.
> For more options, visit https://groups.google.com/groups/opt_out.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to