This time with attachement;)
> Same old topic. This time i try to make a some what longer polymorphic
> hierarchy, like:
> 
> Base <= Item <= Leaf
> 
> The attachment is what i came up with. The first impression is that it
> works, but my confidence in it is limited. Further more it will become
> ugly if we add more hierarchies.
> 
> Is there a more simplistic way to achieve this?
> 
> Cheers, Sol.
from sqlalchemy import *

#db = create_engine('postgres:///satest')
db = create_engine("sqlite:///:memory:")

metadata = BoundMetaData(db)


# classes
class Base(object):
    def __repr__(self):
        return "%s %s" % (self.__class__.__name__, self.id)

class Item(Base): pass

class Leaf(Item): pass

# tables
base = Table('base', metadata, 
    Column('id', Integer, primary_key = True),
    Column('type', String),
    )

item = Table('item', metadata, 
    Column('id', Integer, ForeignKey('base.id'), primary_key = True),
    )

leaf = Table('leaf', metadata, 
    Column('id', Integer, ForeignKey('item.id'), primary_key = True),
    )

# mappers
base_join = polymorphic_union(
{
    'leaf' : base.join(item).join(leaf),
    'item' : base.join(item),
    'base' : base.select(base.c.type=='base'),
}, None, 'pjoin')


base_mapper = mapper(Base, base, select_table = base_join,
        polymorphic_on = base_join.c.type, polymorphic_identity='base',
)


item_join = polymorphic_union(
{
    'leaf' : base.join(item).join(leaf),
    'item' : base_join.select(base_join.c.type=='item'),
}, None, 'pjoin')


item_mapper = mapper(Item, item, select_table = item_join,
    polymorphic_on = base_join.c.type,
    inherits=base_mapper,
    polymorphic_identity='item')

leaf_mapper = mapper(Leaf, leaf, inherits=item_mapper,
    polymorphic_identity='leaf')


# create all tables
metadata.create_all()

# create a session
#metadata.engine.echo = True
session = create_session()

session.save(Leaf())
session.save(Leaf())
session.save(Base())
session.save(Item())
session.save(Item())
session.flush()
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to