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