try taking a look at your SQL output.  the issue is pretty obvious,  
the join condition between your two tables is insufficient to get a  
T22 row.  table_2.id has two rows with "0" for the "id" column, so  
joining from table_2 to table_22 on just "id" gives you two rows.  it  
has nothing to do with the relation() or anything else.



On May 18, 2009, at 3:59 PM, fleong wrote:

> from sqlalchemy import *
> from sqlalchemy.orm import *
>
>
> engine = create_engine('sqlite:///',echo = True)
>
> metadata = MetaData()
>
> table_1 =  \
> Table(
>    'table_1', metadata,
>    Column('id', Integer, primary_key = True),
> )
>
> table_2 = \
> Table(
>    'table_2', metadata,
>    Column('id', Integer, primary_key = True),
>    Column('id2', Integer, primary_key = True),
>    Column('type', Integer, nullable = False),
>    ForeignKeyConstraint(['id'],['table_1.id'])
> )
>
> table_21 = \
> Table(
>    'table_21', metadata,
>    Column('id', Integer, primary_key = True),
>    Column('id2', Integer, primary_key = True),
>    Column('info', String),
>    ForeignKeyConstraint(['id'],['table_2.id']),
> )
>
> table_22 = \
> Table(
>    'table_22', metadata,
>    Column('id', Integer, primary_key = True),
>    Column('id2', Integer, primary_key = True),
>    Column('ext', Integer, primary_key = True),
>    Column('info', String),
>    ForeignKeyConstraint(['id'],['table_2.id']),
>    ForeignKeyConstraint(['ext'],['table_ex22.id'])
> )
>
> table_ex22 = \
> Table(
>    'table_ex22', metadata,
>    Column('id', Integer, primary_key = True),
> )
>
> class Table1(object):
>    pass
>
> class Table2(object):
>    pass
>
> class Table21(Table2):
>    pass
>
> class Table22(Table2):
>    pass
>
> class TableEx22(object):
>    pass
>
> mapper(Table1, table_1,
>       properties = {\
>       't2': relation(Table2, backref = 't1', cascade = 'all, delete,
> delete-orphan', passive_updates = False, passive_deletes = False),
>       }
> )
> mapper(TableEx22, table_ex22,
>       properties = {\
>       't22': relation(Table22, backref = 'tex', cascade = 'all,
> delete, delete-orphan', passive_updates =False, passive_deletes =
> False),
>       }
> )
> mapper(Table2, table_2, polymorphic_on=table_2.c.type,
> polymorphic_identity=0)
> mapper(Table21, table_21, inherits=Table2, polymorphic_identity=1)
> mapper(Table22, table_22, inherits=Table2, polymorphic_identity=2)
>
> Session = sessionmaker()
> #------------------------------------------------------------------------------
>
> #test:
>
> metadata.bind = engine
> metadata.create_all()
>
> s = Session()
>
> t = Table1()
> t.id = 0
>
> tex = TableEx22()
> tex.id = 0
>
> s.add(t)
> s.add(tex)
> s.commit()
>
> t21 = Table21()
> t21.id2 = 0
> t21.t1 = t
> s.add(t21)
> s.commit()
>
> t22 = Table22()
> t22.id2 = 1
> t22.t1 = t
> t22.tex = tex
> s.add(t22)
> s.commit()
>
> for i in tex.t22:
>    print type(i)
>


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